|
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" |
@@ -2336,18 +2339,21 @@ createSpecializedStructOrClassType(NominalOrBoundGenericNominalType *Type, |
2336 | 2339 | if (visitedOriginallyDefinedIn) |
2337 | 2340 | return TypeWalker::Action::Stop; |
2338 | 2341 |
|
2339 | | - // A typealias inside a function used that function's signature as part of |
| 2342 | + DeclContext *D = nullptr; |
| 2343 | + if (auto *TAT = llvm::dyn_cast<TypeAliasType>(T)) |
| 2344 | + D = TAT->getDecl()->getDeclContext(); |
| 2345 | + else if (auto *NT = llvm::dyn_cast<NominalOrBoundGenericNominalType>(T)) |
| 2346 | + D = NT->getDecl()->getDeclContext(); |
| 2347 | + |
| 2348 | + // A type inside a function uses that function's signature as part of |
2340 | 2349 | // its mangling, so check if any types in the generic signature are |
2341 | 2350 | // annotated with @_originallyDefinedIn. |
2342 | | - if (auto *TAT = llvm::dyn_cast<TypeAliasType>(T)) { |
2343 | | - auto D = TAT->getDecl()->getDeclContext(); |
2344 | | - if (auto AFD = llvm::dyn_cast<AbstractFunctionDecl>(D)) { |
2345 | | - OriginallyDefinedInFinder InnerWalker; |
2346 | | - AFD->getInterfaceType().walk(InnerWalker); |
2347 | | - if (InnerWalker.visitedOriginallyDefinedIn) { |
2348 | | - visitedOriginallyDefinedIn = true; |
2349 | | - return TypeWalker::Action::Stop; |
2350 | | - } |
| 2351 | + if (auto AFD = llvm::dyn_cast_or_null<AbstractFunctionDecl>(D)) { |
| 2352 | + OriginallyDefinedInFinder InnerWalker; |
| 2353 | + AFD->getInterfaceType().walk(InnerWalker); |
| 2354 | + if (InnerWalker.visitedOriginallyDefinedIn) { |
| 2355 | + visitedOriginallyDefinedIn = true; |
| 2356 | + return TypeWalker::Action::Stop; |
2351 | 2357 | } |
2352 | 2358 | } |
2353 | 2359 |
|
|
0 commit comments