aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/SemaTemplate.cpp
diff options
context:
space:
mode:
authorAbramo Bagnara <abramo.bagnara@gmail.com>2010-05-14 14:14:23 +0000
committerAbramo Bagnara <abramo.bagnara@gmail.com>2010-05-14 14:14:23 +0000
commit5431299f6e1e1d14b39b924fe24bf04035f4ae42 (patch)
tree3a7b71858cc3744c88c4cfb098e5c646b8c71d63 /lib/Sema/SemaTemplate.cpp
parent95f1b15ce1b281c8517d77792abe540753fbcc12 (diff)
Added basic source locations to Elaborated and DependentName types.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@103770 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaTemplate.cpp')
-rw-r--r--lib/Sema/SemaTemplate.cpp50
1 files changed, 40 insertions, 10 deletions
diff --git a/lib/Sema/SemaTemplate.cpp b/lib/Sema/SemaTemplate.cpp
index 9009b4d897..d8b00cc816 100644
--- a/lib/Sema/SemaTemplate.cpp
+++ b/lib/Sema/SemaTemplate.cpp
@@ -5184,16 +5184,18 @@ Sema::ActOnDependentTag(Scope *S, unsigned TagSpec, TagUseKind TUK,
static void FillTypeLoc(DependentNameTypeLoc TL,
SourceLocation TypenameLoc,
- SourceRange QualifierRange) {
- // FIXME: typename, qualifier range
- TL.setNameLoc(TypenameLoc);
+ SourceRange QualifierRange,
+ SourceLocation NameLoc) {
+ // FIXME: qualifier range
+ TL.setKeywordLoc(TypenameLoc);
+ TL.setNameLoc(NameLoc);
}
static void FillTypeLoc(ElaboratedTypeLoc TL,
SourceLocation TypenameLoc,
SourceRange QualifierRange) {
- // FIXME: typename, qualifier range
- TL.setNameLoc(TypenameLoc);
+ // FIXME: qualifier range and inner locations.
+ TL.setKeywordLoc(TypenameLoc);
}
Sema::TypeResult
@@ -5213,7 +5215,7 @@ Sema::ActOnTypenameType(SourceLocation TypenameLoc, const CXXScopeSpec &SS,
if (isa<DependentNameType>(T)) {
DependentNameTypeLoc TL = cast<DependentNameTypeLoc>(TSI->getTypeLoc());
// FIXME: fill inner type loc
- FillTypeLoc(TL, TypenameLoc, SS.getRange());
+ FillTypeLoc(TL, TypenameLoc, SS.getRange(), IdLoc);
} else {
ElaboratedTypeLoc TL = cast<ElaboratedTypeLoc>(TSI->getTypeLoc());
// FIXME: fill inner type loc
@@ -5249,7 +5251,7 @@ Sema::ActOnTypenameType(SourceLocation TypenameLoc, const CXXScopeSpec &SS,
TypeSourceInfo *TSI = Context.CreateTypeSourceInfo(T);
DependentNameTypeLoc TL = cast<DependentNameTypeLoc>(TSI->getTypeLoc());
// FIXME: fill inner type loc
- FillTypeLoc(TL, TypenameLoc, SS.getRange());
+ FillTypeLoc(TL, TypenameLoc, SS.getRange(), TemplateLoc);
return CreateLocInfoType(T, TSI).getAsOpaquePtr();
}
@@ -5426,13 +5428,41 @@ CurrentInstantiationRebuilder::TransformDependentNameType(TypeLocBuilder &TLB,
} else
Result = getDerived().RebuildDependentNameType(T->getKeyword(),
NNS, T->getIdentifier(),
- SourceRange(TL.getNameLoc()));
+ TL.getSourceRange());
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;
}