return TypeClass::classof(Ty);
}
- static bool classof(const TypeLoc *TL) {
- return Derived::classofType(TL->getTypePtr());
- }
- static bool classof(const UnqualTypeLoc *TL) {
- return Derived::classofType(TL->getTypePtr());
- }
- static bool classof(const Derived *TL) {
- return true;
- }
-
TypeLoc getNextTypeLoc() const {
return getNextTypeLoc(asDerived()->getInnerType());
}
DecltypeType> {
};
-// FIXME: locations for the nested name specifier should be put in
-// NestedNameSpecifier
-struct ElaboratedLocInfo {
- SourceLocation KeywordLoc;
-};
-
-class ElaboratedTypeLoc : public ConcreteTypeLoc<UnqualTypeLoc,
- ElaboratedTypeLoc,
- ElaboratedType,
- ElaboratedLocInfo> {
-public:
- SourceLocation getKeywordLoc() const {
- return this->getLocalData()->KeywordLoc;
- }
- void setKeywordLoc(SourceLocation Loc) {
- this->getLocalData()->KeywordLoc = Loc;
- }
-
- SourceRange getSourceRange() const {
- return SourceRange(getKeywordLoc(), getKeywordLoc());
- }
-
- void initializeLocal(SourceLocation Loc) {
- setKeywordLoc(Loc);
- }
-
- TypeLoc getNamedTypeLoc() const {
- return getInnerTypeLoc();
- }
-
- QualType getInnerType() const {
- return getTypePtr()->getNamedType();
- }
-};
-
-// FIXME: locations for the nested name specifier should be put in
-// NestedNameSpecifier
-struct DependentNameLocInfo {
- SourceLocation KeywordLoc;
- SourceLocation NameLoc;
+// FIXME: locations for the nested name specifier; at the very least,
+// a SourceRange.
+class ElaboratedTypeLoc :
+ public InheritingConcreteTypeLoc<TypeSpecTypeLoc,
+ ElaboratedTypeLoc,
+ ElaboratedType> {
};
-class DependentNameTypeLoc : public ConcreteTypeLoc<UnqualTypeLoc,
- DependentNameTypeLoc,
- DependentNameType,
- DependentNameLocInfo> {
-public:
- SourceLocation getKeywordLoc() const {
- return this->getLocalData()->KeywordLoc;
- }
- void setKeywordLoc(SourceLocation Loc) {
- this->getLocalData()->KeywordLoc = Loc;
- }
-
- SourceLocation getNameLoc() const {
- return this->getLocalData()->NameLoc;
- }
- void setNameLoc(SourceLocation Loc) {
- this->getLocalData()->NameLoc = Loc;
- }
-
- SourceRange getSourceRange() const {
- return SourceRange(getKeywordLoc(), getNameLoc());
- }
-
- void initializeLocal(SourceLocation Loc) {
- setKeywordLoc(Loc);
- setNameLoc(Loc);
- }
+// FIXME: locations for the typename keyword and nested name specifier.
+class DependentNameTypeLoc : public InheritingConcreteTypeLoc<TypeSpecTypeLoc,
+ DependentNameTypeLoc,
+ DependentNameType> {
};
}
Record, Idx));
}
void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
- TL.setKeywordLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
+ TL.setNameLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
}
void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
TL.setNameLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
}
void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
- TL.setKeywordLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
TL.setNameLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
}
void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
Writer.AddTemplateArgumentLoc(TL.getArgLoc(i), Record);
}
void TypeLocWriter::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
- Writer.AddSourceLocation(TL.getKeywordLoc(), Record);
+ Writer.AddSourceLocation(TL.getNameLoc(), Record);
}
void TypeLocWriter::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
Writer.AddSourceLocation(TL.getNameLoc(), Record);
}
void TypeLocWriter::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
- Writer.AddSourceLocation(TL.getKeywordLoc(), Record);
Writer.AddSourceLocation(TL.getNameLoc(), Record);
}
void TypeLocWriter::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
static void FillTypeLoc(DependentNameTypeLoc TL,
SourceLocation TypenameLoc,
- SourceRange QualifierRange,
- SourceLocation NameLoc) {
- // FIXME: qualifier range
- TL.setKeywordLoc(TypenameLoc);
- TL.setNameLoc(NameLoc);
+ SourceRange QualifierRange) {
+ // FIXME: typename, qualifier range
+ TL.setNameLoc(TypenameLoc);
}
static void FillTypeLoc(ElaboratedTypeLoc TL,
SourceLocation TypenameLoc,
SourceRange QualifierRange) {
- // FIXME: qualifier range and inner locations.
- TL.setKeywordLoc(TypenameLoc);
+ // FIXME: typename, qualifier range
+ TL.setNameLoc(TypenameLoc);
}
Sema::TypeResult
if (isa<DependentNameType>(T)) {
DependentNameTypeLoc TL = cast<DependentNameTypeLoc>(TSI->getTypeLoc());
// FIXME: fill inner type loc
- FillTypeLoc(TL, TypenameLoc, SS.getRange(), IdLoc);
+ FillTypeLoc(TL, TypenameLoc, SS.getRange());
} else {
ElaboratedTypeLoc TL = cast<ElaboratedTypeLoc>(TSI->getTypeLoc());
// FIXME: fill inner type loc
TypeSourceInfo *TSI = Context.CreateTypeSourceInfo(T);
DependentNameTypeLoc TL = cast<DependentNameTypeLoc>(TSI->getTypeLoc());
// FIXME: fill inner type loc
- FillTypeLoc(TL, TypenameLoc, SS.getRange(), TemplateLoc);
+ FillTypeLoc(TL, TypenameLoc, SS.getRange());
return CreateLocInfoType(T, TSI).getAsOpaquePtr();
}
} else
Result = getDerived().RebuildDependentNameType(T->getKeyword(),
NNS, T->getIdentifier(),
- TL.getSourceRange());
+ SourceRange(TL.getNameLoc()));
if (Result.isNull())
return QualType();
- 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());
- }
+ DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
+ NewTL.setNameLoc(TL.getNameLoc());
return Result;
}
return;
}
- TypeLoc OldTL = TInfo->getTypeLoc();
- if (TInfo->getType()->getAs<ElaboratedType>()) {
- ElaboratedTypeLoc ElabTL = cast<ElaboratedTypeLoc>(OldTL);
- TemplateSpecializationTypeLoc NamedTL =
- cast<TemplateSpecializationTypeLoc>(ElabTL.getNamedTypeLoc());
- TL.copy(NamedTL);
- }
- else
- TL.copy(cast<TemplateSpecializationTypeLoc>(OldTL));
+ TemplateSpecializationTypeLoc OldTL =
+ cast<TemplateSpecializationTypeLoc>(TInfo->getTypeLoc());
+ TL.copy(OldTL);
}
void VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
assert(DS.getTypeSpecType() == DeclSpec::TST_typeofExpr);
TL.setBuiltinLoc(DS.getTypeSpecWidthLoc());
}
}
- void VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
- ElaboratedTypeKeyword Keyword
- = TypeWithKeyword::getKeywordForTypeSpec(DS.getTypeSpecType());
- TL.setKeywordLoc(Keyword != ETK_None
- ? DS.getTypeSpecTypeLoc()
- : SourceLocation());
- Visit(TL.getNextTypeLoc().getUnqualifiedLoc());
- }
- void VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
- ElaboratedTypeKeyword Keyword
- = TypeWithKeyword::getKeywordForTypeSpec(DS.getTypeSpecType());
- TL.setKeywordLoc(Keyword != ETK_None
- ? DS.getTypeSpecTypeLoc()
- : SourceLocation());
- TL.setNameLoc(DS.getTypeSpecTypeLoc());
- }
-
void VisitTypeLoc(TypeLoc TL) {
// FIXME: add other typespec types and change this to an assert.
TL.initialize(DS.getTypeSpecTypeLoc());
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(),
- /* FIXME */ SourceRange(),
+ 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() ||
}
ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
- NewTL.setKeywordLoc(TL.getKeywordLoc());
+ NewTL.setNameLoc(TL.getNameLoc());
return Result;
}
if (Result.isNull())
return QualType();
- 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());
- }
+ DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
+ NewTL.setNameLoc(TL.getNameLoc());
+
return Result;
}