|
25 | 25 | #include "swift/AST/ASTMangler.h"
|
26 | 26 | #include "swift/AST/Attr.h"
|
27 | 27 | #include "swift/AST/Decl.h"
|
| 28 | +#include "swift/AST/DeclContext.h" |
28 | 29 | #include "swift/AST/Expr.h"
|
29 | 30 | #include "swift/AST/GenericEnvironment.h"
|
30 | 31 | #include "swift/AST/IRGenOptions.h"
|
|
34 | 35 | #include "swift/AST/Pattern.h"
|
35 | 36 | #include "swift/AST/TypeDifferenceVisitor.h"
|
36 | 37 | #include "swift/AST/TypeWalker.h"
|
| 38 | +#include "swift/AST/Types.h" |
37 | 39 | #include "swift/Basic/Assertions.h"
|
38 | 40 | #include "swift/Basic/Compiler.h"
|
39 | 41 | #include "swift/Basic/SourceManager.h"
|
|
65 | 67 | #include "llvm/IR/DebugInfo.h"
|
66 | 68 | #include "llvm/IR/IntrinsicInst.h"
|
67 | 69 | #include "llvm/IR/Module.h"
|
| 70 | +#include "llvm/Support/Casting.h" |
68 | 71 | #include "llvm/Support/CommandLine.h"
|
69 | 72 | #include "llvm/Support/Debug.h"
|
70 | 73 | #include "llvm/Support/FileSystem.h"
|
@@ -2343,18 +2346,21 @@ createSpecializedStructOrClassType(NominalOrBoundGenericNominalType *Type,
|
2343 | 2346 | if (visitedOriginallyDefinedIn)
|
2344 | 2347 | return TypeWalker::Action::Stop;
|
2345 | 2348 |
|
2346 |
| - // A typealias inside a function used that function's signature as part of |
| 2349 | + DeclContext *D = nullptr; |
| 2350 | + if (auto *TAT = llvm::dyn_cast<TypeAliasType>(T)) |
| 2351 | + D = TAT->getDecl()->getDeclContext(); |
| 2352 | + else if (auto *NT = llvm::dyn_cast<NominalOrBoundGenericNominalType>(T)) |
| 2353 | + D = NT->getDecl()->getDeclContext(); |
| 2354 | + |
| 2355 | + // A type inside a function uses that function's signature as part of |
2347 | 2356 | // its mangling, so check if any types in the generic signature are
|
2348 | 2357 | // annotated with @_originallyDefinedIn.
|
2349 |
| - if (auto *TAT = llvm::dyn_cast<TypeAliasType>(T)) { |
2350 |
| - auto D = TAT->getDecl()->getDeclContext(); |
2351 |
| - if (auto AFD = llvm::dyn_cast<AbstractFunctionDecl>(D)) { |
2352 |
| - OriginallyDefinedInFinder InnerWalker; |
2353 |
| - AFD->getInterfaceType().walk(InnerWalker); |
2354 |
| - if (InnerWalker.visitedOriginallyDefinedIn) { |
2355 |
| - visitedOriginallyDefinedIn = true; |
2356 |
| - return TypeWalker::Action::Stop; |
2357 |
| - } |
| 2358 | + if (auto AFD = llvm::dyn_cast_or_null<AbstractFunctionDecl>(D)) { |
| 2359 | + OriginallyDefinedInFinder InnerWalker; |
| 2360 | + AFD->getInterfaceType().walk(InnerWalker); |
| 2361 | + if (InnerWalker.visitedOriginallyDefinedIn) { |
| 2362 | + visitedOriginallyDefinedIn = true; |
| 2363 | + return TypeWalker::Action::Stop; |
2358 | 2364 | }
|
2359 | 2365 | }
|
2360 | 2366 |
|
|
0 commit comments