summaryrefslogtreecommitdiffstats
path: root/clang/lib/Serialization
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2014-10-21 21:15:18 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2014-10-21 21:15:18 +0000
commit6377f8f7fb1f0ed32fd80acf733659fb7982011b (patch)
treee4942303386487d4d828d6d0249b1cd21b30e56b /clang/lib/Serialization
parenta721db24c08bd64dc3495ce1b20bf8dc182e9656 (diff)
downloadbcm5719-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.cpp17
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);
}
OpenPOWER on IntegriCloud