|
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