diff options
Diffstat (limited to 'clang/lib/Sema/TreeTransform.h')
| -rw-r--r-- | clang/lib/Sema/TreeTransform.h | 45 |
1 files changed, 36 insertions, 9 deletions
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 35152617336..4929bf7ba3b 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -3247,22 +3247,22 @@ QualType TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, ElaboratedTypeLoc TL, QualType ObjectType) { + QualType Named = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); + if (Named.isNull()) + return QualType(); + ElaboratedType *T = TL.getTypePtr(); NestedNameSpecifier *NNS = 0; // NOTE: the qualifier in an ElaboratedType is optional. if (T->getQualifier() != 0) { NNS = getDerived().TransformNestedNameSpecifier(T->getQualifier(), - SourceRange(), + /* FIXME */ SourceRange(), ObjectType); if (!NNS) return QualType(); } - QualType Named = getDerived().TransformType(T->getNamedType()); - if (Named.isNull()) - return QualType(); - QualType Result = TL.getType(); if (getDerived().AlwaysRebuild() || NNS != T->getQualifier() || @@ -3273,7 +3273,7 @@ TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, } ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); - NewTL.setNameLoc(TL.getNameLoc()); + NewTL.setKeywordLoc(TL.getKeywordLoc()); return Result; } @@ -3315,9 +3315,36 @@ QualType TreeTransform<Derived>::TransformDependentNameType(TypeLocBuilder &TLB, if (Result.isNull()) return QualType(); - DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); - NewTL.setNameLoc(TL.getNameLoc()); - + if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { + QualType NamedT = ElabT->getNamedType(); + if (isa<TypedefType>(NamedT)) { + TypedefTypeLoc NamedTLoc = TLB.push<TypedefTypeLoc>(NamedT); + NamedTLoc.setNameLoc(TL.getNameLoc()); + } + else if (isa<RecordType>(NamedT)) { + RecordTypeLoc NamedTLoc = TLB.push<RecordTypeLoc>(NamedT); + NamedTLoc.setNameLoc(TL.getNameLoc()); + } + else if (isa<EnumType>(NamedT)) { + EnumTypeLoc NamedTLoc = TLB.push<EnumTypeLoc>(NamedT); + NamedTLoc.setNameLoc(TL.getNameLoc()); + } + else if (isa<TemplateSpecializationType>(NamedT)) { + TemplateSpecializationTypeLoc NamedTLoc + = TLB.push<TemplateSpecializationTypeLoc>(NamedT); + // FIXME: fill locations + NamedTLoc.initializeLocal(SourceLocation()); + } + else + llvm_unreachable("Unexpected type"); + ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); + NewTL.setKeywordLoc(TL.getKeywordLoc()); + } + else { + DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); + NewTL.setKeywordLoc(TL.getKeywordLoc()); + NewTL.setNameLoc(TL.getNameLoc()); + } return Result; } |

