diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-10-21 21:15:18 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-10-21 21:15:18 +0000 |
commit | 6377f8f7fb1f0ed32fd80acf733659fb7982011b (patch) | |
tree | e4942303386487d4d828d6d0249b1cd21b30e56b /clang/lib/Serialization | |
parent | a721db24c08bd64dc3495ce1b20bf8dc182e9656 (diff) | |
download | bcm5719-llvm-6377f8f7fb1f0ed32fd80acf733659fb7982011b.tar.gz bcm5719-llvm-6377f8f7fb1f0ed32fd80acf733659fb7982011b.zip |
[modules] When building an injected-class-name type, we may have to insert it
into multiple merged classes' TypeForDecl slots.
llvm-svn: 220331
Diffstat (limited to 'clang/lib/Serialization')
-rw-r--r-- | clang/lib/Serialization/ASTReader.cpp | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 3ffbb501efc..3a6e6551dbf 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -5493,13 +5493,18 @@ QualType ASTReader::readTypeRecord(unsigned Index) { QualType TST = readType(*Loc.F, Record, Idx); // probably derivable // FIXME: ASTContext::getInjectedClassNameType is not currently suitable // for AST reading, too much interdependencies. - const Type *T; - if (const Type *Existing = D->getTypeForDecl()) - T = Existing; - else if (auto *Prev = D->getPreviousDecl()) - T = Prev->getTypeForDecl(); - else + const Type *T = nullptr; + for (auto *DI = D; DI; DI = DI->getPreviousDecl()) { + if (const Type *Existing = DI->getTypeForDecl()) { + T = Existing; + break; + } + } + if (!T) { T = new (Context, TypeAlignment) InjectedClassNameType(D, TST); + for (auto *DI = D; DI; DI = DI->getPreviousDecl()) + DI->setTypeForDecl(T); + } return QualType(T, 0); } |