|
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