[cfe-commits] r104169 - in /cfe/trunk: include/clang/AST/TypeLoc.h lib/Frontend/PCHReader.cpp lib/Frontend/PCHWriter.cpp lib/Parse/ParseDecl.cpp lib/Sema/Sema.h lib/Sema/SemaDecl.cpp lib/Sema/SemaDeclCXX.cpp lib/Sema/SemaExprCXX.cpp lib/Sema/SemaTemplate.cpp lib/Sema/SemaType.cpp lib/Sema/TreeTransform.h
Douglas Gregor
dgregor at apple.com
Fri May 28 10:33:06 PDT 2010
Hi Abramo,
This patch appears to be causing some valgrind failures in Clang, which you can see here:
http://google1.osuosl.org:8011/builders/clang-x86_64-linux-vg/builds/1033
It looks like it's a problem with the inner parts of ElaboratedTypeLoc not getting initialized (the FIXMEs).
- Doug
On May 19, 2010, at 2:37 PM, Abramo Bagnara wrote:
> Author: abramo
> Date: Wed May 19 16:37:53 2010
> New Revision: 104169
>
> URL: http://llvm.org/viewvc/llvm-project?rev=104169&view=rev
> Log:
> Added basic source locations to Elaborated and DependentName types.
>
> Modified:
> cfe/trunk/include/clang/AST/TypeLoc.h
> cfe/trunk/lib/Frontend/PCHReader.cpp
> cfe/trunk/lib/Frontend/PCHWriter.cpp
> cfe/trunk/lib/Parse/ParseDecl.cpp
> cfe/trunk/lib/Sema/Sema.h
> cfe/trunk/lib/Sema/SemaDecl.cpp
> cfe/trunk/lib/Sema/SemaDeclCXX.cpp
> cfe/trunk/lib/Sema/SemaExprCXX.cpp
> cfe/trunk/lib/Sema/SemaTemplate.cpp
> cfe/trunk/lib/Sema/SemaType.cpp
> cfe/trunk/lib/Sema/TreeTransform.h
>
> Modified: cfe/trunk/include/clang/AST/TypeLoc.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/TypeLoc.h?rev=104169&r1=104168&r2=104169&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/TypeLoc.h (original)
> +++ cfe/trunk/include/clang/AST/TypeLoc.h Wed May 19 16:37:53 2010
> @@ -269,6 +269,16 @@
> 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());
> }
> @@ -1188,18 +1198,110 @@
> DecltypeType> {
> };
>
> -// FIXME: locations for the nested name specifier; at the very least,
> -// a SourceRange.
> -class ElaboratedTypeLoc :
> - public InheritingConcreteTypeLoc<TypeSpecTypeLoc,
> - ElaboratedTypeLoc,
> - ElaboratedType> {
> +struct ElaboratedLocInfo {
> + SourceLocation KeywordLoc;
> + SourceRange QualifierRange;
> +};
> +
> +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 getQualifierRange() const {
> + return this->getLocalData()->QualifierRange;
> + }
> + void setQualifierRange(SourceRange Range) {
> + this->getLocalData()->QualifierRange = Range;
> + }
> +
> + SourceRange getSourceRange() const {
> + if (getKeywordLoc().isValid())
> + if (getQualifierRange().getEnd().isValid())
> + return SourceRange(getKeywordLoc(), getQualifierRange().getEnd());
> + else
> + return SourceRange(getKeywordLoc());
> + else
> + return getQualifierRange();
> + }
> +
> + void initializeLocal(SourceLocation Loc) {
> + setKeywordLoc(Loc);
> + setQualifierRange(SourceRange(Loc));
> + }
> +
> + TypeLoc getNamedTypeLoc() const {
> + return getInnerTypeLoc();
> + }
> +
> + QualType getInnerType() const {
> + return getTypePtr()->getNamedType();
> + }
> +
> + void copy(ElaboratedTypeLoc Loc) {
> + unsigned size = getFullDataSize();
> + assert(size == Loc.getFullDataSize());
> + memcpy(Data, Loc.Data, size);
> + }
> };
>
> -// FIXME: locations for the typename keyword and nested name specifier.
> -class DependentNameTypeLoc : public InheritingConcreteTypeLoc<TypeSpecTypeLoc,
> - DependentNameTypeLoc,
> - DependentNameType> {
> +struct DependentNameLocInfo {
> + SourceLocation KeywordLoc;
> + SourceRange QualifierRange;
> + SourceLocation NameLoc;
> +};
> +
> +class DependentNameTypeLoc : public ConcreteTypeLoc<UnqualTypeLoc,
> + DependentNameTypeLoc,
> + DependentNameType,
> + DependentNameLocInfo> {
> +public:
> + SourceLocation getKeywordLoc() const {
> + return this->getLocalData()->KeywordLoc;
> + }
> + void setKeywordLoc(SourceLocation Loc) {
> + this->getLocalData()->KeywordLoc = Loc;
> + }
> +
> + SourceRange getQualifierRange() const {
> + return this->getLocalData()->QualifierRange;
> + }
> + void setQualifierRange(SourceRange Range) {
> + this->getLocalData()->QualifierRange = Range;
> + }
> +
> + SourceLocation getNameLoc() const {
> + return this->getLocalData()->NameLoc;
> + }
> + void setNameLoc(SourceLocation Loc) {
> + this->getLocalData()->NameLoc = Loc;
> + }
> +
> + SourceRange getSourceRange() const {
> + if (getKeywordLoc().isValid())
> + return SourceRange(getKeywordLoc(), getNameLoc());
> + else
> + return SourceRange(getQualifierRange().getBegin(), getNameLoc());
> + }
> +
> + void copy(DependentNameTypeLoc Loc) {
> + unsigned size = getFullDataSize();
> + assert(size == Loc.getFullDataSize());
> + memcpy(Data, Loc.Data, size);
> + }
> +
> + void initializeLocal(SourceLocation Loc) {
> + setKeywordLoc(Loc);
> + setQualifierRange(SourceRange(Loc));
> + setNameLoc(Loc);
> + }
> };
>
> }
>
> Modified: cfe/trunk/lib/Frontend/PCHReader.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/PCHReader.cpp?rev=104169&r1=104168&r2=104169&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Frontend/PCHReader.cpp (original)
> +++ cfe/trunk/lib/Frontend/PCHReader.cpp Wed May 19 16:37:53 2010
> @@ -2356,12 +2356,15 @@
> Record, Idx));
> }
> void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
> - TL.setNameLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
> + TL.setKeywordLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
> + TL.setQualifierRange(Reader.ReadSourceRange(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.setQualifierRange(Reader.ReadSourceRange(Record, Idx));
> TL.setNameLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
> }
> void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
>
> Modified: cfe/trunk/lib/Frontend/PCHWriter.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/PCHWriter.cpp?rev=104169&r1=104168&r2=104169&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Frontend/PCHWriter.cpp (original)
> +++ cfe/trunk/lib/Frontend/PCHWriter.cpp Wed May 19 16:37:53 2010
> @@ -397,12 +397,15 @@
> Writer.AddTemplateArgumentLoc(TL.getArgLoc(i), Record);
> }
> void TypeLocWriter::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
> - Writer.AddSourceLocation(TL.getNameLoc(), Record);
> + Writer.AddSourceLocation(TL.getKeywordLoc(), Record);
> + Writer.AddSourceRange(TL.getQualifierRange(), Record);
> }
> void TypeLocWriter::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
> Writer.AddSourceLocation(TL.getNameLoc(), Record);
> }
> void TypeLocWriter::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
> + Writer.AddSourceLocation(TL.getKeywordLoc(), Record);
> + Writer.AddSourceRange(TL.getQualifierRange(), Record);
> Writer.AddSourceLocation(TL.getNameLoc(), Record);
> }
> void TypeLocWriter::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
>
> Modified: cfe/trunk/lib/Parse/ParseDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=104169&r1=104168&r2=104169&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Parse/ParseDecl.cpp (original)
> +++ cfe/trunk/lib/Parse/ParseDecl.cpp Wed May 19 16:37:53 2010
> @@ -1877,7 +1877,7 @@
> if (Tok.is(tok::kw___attribute))
> Attr.reset(ParseGNUAttributes());
>
> - CXXScopeSpec SS;
> + CXXScopeSpec &SS = DS.getTypeSpecScope();
> if (getLang().CPlusPlus) {
> if (ParseOptionalCXXScopeSpecifier(SS, 0, false))
> return;
>
> Modified: cfe/trunk/lib/Sema/Sema.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.h?rev=104169&r1=104168&r2=104169&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/Sema.h (original)
> +++ cfe/trunk/lib/Sema/Sema.h Wed May 19 16:37:53 2010
> @@ -3117,7 +3117,9 @@
> QualType CheckTypenameType(ElaboratedTypeKeyword Keyword,
> NestedNameSpecifier *NNS,
> const IdentifierInfo &II,
> - SourceRange Range);
> + SourceLocation KeywordLoc,
> + SourceRange NNSRange,
> + SourceLocation IILoc);
>
> TypeSourceInfo *RebuildTypeInCurrentInstantiation(TypeSourceInfo *T,
> SourceLocation Loc,
>
> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=104169&r1=104168&r2=104169&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Wed May 19 16:37:53 2010
> @@ -90,8 +90,9 @@
> // We know from the grammar that this name refers to a type, so build a
> // DependentNameType node to describe the type.
> return CheckTypenameType(ETK_None,
> - (NestedNameSpecifier *)SS->getScopeRep(),
> - II, SS->getRange()).getAsOpaquePtr();
> + (NestedNameSpecifier *)SS->getScopeRep(), II,
> + SourceLocation(), SS->getRange(), NameLoc
> + ).getAsOpaquePtr();
> }
>
> return 0;
>
> Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=104169&r1=104168&r2=104169&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Wed May 19 16:37:53 2010
> @@ -1136,7 +1136,8 @@
> // specialization, we take it as a type name.
> BaseType = CheckTypenameType(ETK_None,
> (NestedNameSpecifier *)SS.getScopeRep(),
> - *MemberOrBase, SS.getRange());
> + *MemberOrBase, SourceLocation(),
> + SS.getRange(), IdLoc);
> if (BaseType.isNull())
> return true;
>
>
> Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=104169&r1=104168&r2=104169&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Wed May 19 16:37:53 2010
> @@ -261,7 +261,8 @@
> Range = SourceRange(NameLoc);
> }
>
> - return CheckTypenameType(ETK_None, NNS, II, Range).getAsOpaquePtr();
> + return CheckTypenameType(ETK_None, NNS, II, SourceLocation(),
> + Range, NameLoc).getAsOpaquePtr();
> }
>
> if (ObjectTypePtr)
>
> Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=104169&r1=104168&r2=104169&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaTemplate.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaTemplate.cpp Wed May 19 16:37:53 2010
> @@ -5184,16 +5184,19 @@
>
> static void FillTypeLoc(DependentNameTypeLoc TL,
> SourceLocation TypenameLoc,
> - SourceRange QualifierRange) {
> - // FIXME: typename, qualifier range
> - TL.setNameLoc(TypenameLoc);
> + SourceRange QualifierRange,
> + SourceLocation NameLoc) {
> + TL.setKeywordLoc(TypenameLoc);
> + TL.setQualifierRange(QualifierRange);
> + TL.setNameLoc(NameLoc);
> }
>
> static void FillTypeLoc(ElaboratedTypeLoc TL,
> SourceLocation TypenameLoc,
> SourceRange QualifierRange) {
> - // FIXME: typename, qualifier range
> - TL.setNameLoc(TypenameLoc);
> + // FIXME: inner locations.
> + TL.setKeywordLoc(TypenameLoc);
> + TL.setQualifierRange(QualifierRange);
> }
>
> Sema::TypeResult
> @@ -5205,7 +5208,7 @@
> return true;
>
> QualType T = CheckTypenameType(ETK_Typename, NNS, II,
> - SourceRange(TypenameLoc, IdLoc));
> + TypenameLoc, SS.getRange(), IdLoc);
> if (T.isNull())
> return true;
>
> @@ -5213,7 +5216,7 @@
> 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 +5252,7 @@
> 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();
> }
>
> @@ -5258,10 +5261,11 @@
> QualType
> Sema::CheckTypenameType(ElaboratedTypeKeyword Keyword,
> NestedNameSpecifier *NNS, const IdentifierInfo &II,
> - SourceRange Range) {
> + SourceLocation KeywordLoc, SourceRange NNSRange,
> + SourceLocation IILoc) {
> CXXScopeSpec SS;
> SS.setScopeRep(NNS);
> - SS.setRange(Range);
> + SS.setRange(NNSRange);
>
> DeclContext *Ctx = computeDeclContext(SS);
> if (!Ctx) {
> @@ -5281,7 +5285,7 @@
> return QualType();
>
> DeclarationName Name(&II);
> - LookupResult Result(*this, Name, Range.getEnd(), LookupOrdinaryName);
> + LookupResult Result(*this, Name, IILoc, LookupOrdinaryName);
> LookupQualifiedName(Result, Ctx);
> unsigned DiagID = 0;
> Decl *Referenced = 0;
> @@ -5321,7 +5325,9 @@
>
> // If we get here, it's because name lookup did not find a
> // type. Emit an appropriate diagnostic and return an error.
> - Diag(Range.getEnd(), DiagID) << Range << Name << Ctx;
> + SourceRange FullRange(KeywordLoc.isValid() ? KeywordLoc : NNSRange.getBegin(),
> + IILoc);
> + Diag(IILoc, DiagID) << FullRange << Name << Ctx;
> if (Referenced)
> Diag(Referenced->getLocation(), diag::note_typename_refers_here)
> << Name;
> @@ -5393,7 +5399,7 @@
>
> NestedNameSpecifier *NNS
> = TransformNestedNameSpecifier(T->getQualifier(),
> - /*FIXME:*/SourceRange(getBaseLocation()),
> + TL.getQualifierRange(),
> ObjectType);
> if (!NNS)
> return QualType();
> @@ -5402,7 +5408,7 @@
> // context corresponding to the nested-name-specifier, then this
> // typename type will not change; exit early.
> CXXScopeSpec SS;
> - SS.setRange(SourceRange(getBaseLocation()));
> + SS.setRange(TL.getQualifierRange());
> SS.setScopeRep(NNS);
>
> QualType Result;
> @@ -5421,18 +5427,38 @@
> NewTemplateId == QualType(TemplateId, 0))
> Result = QualType(T, 0);
> else
> - Result = getDerived().RebuildDependentNameType(T->getKeyword(),
> + Result = getDerived().RebuildDependentNameType(T->getKeyword(),
> NNS, NewTemplateId);
> } else
> - Result = getDerived().RebuildDependentNameType(T->getKeyword(),
> - NNS, T->getIdentifier(),
> - SourceRange(TL.getNameLoc()));
> + Result = getDerived().RebuildDependentNameType(T->getKeyword(), NNS,
> + T->getIdentifier(),
> + TL.getKeywordLoc(),
> + TL.getQualifierRange(),
> + TL.getNameLoc());
>
> 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<TemplateSpecializationType>(NamedT)) {
> + TemplateSpecializationTypeLoc NamedTLoc
> + = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
> + // FIXME: fill locations
> + NamedTLoc.initializeLocal(TL.getNameLoc());
> + } else {
> + TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
> + }
> + ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
> + NewTL.setKeywordLoc(TL.getKeywordLoc());
> + NewTL.setQualifierRange(TL.getQualifierRange());
> + }
> + else {
> + DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
> + NewTL.setKeywordLoc(TL.getKeywordLoc());
> + NewTL.setQualifierRange(TL.getQualifierRange());
> + NewTL.setNameLoc(TL.getNameLoc());
> + }
> return Result;
> }
>
>
> Modified: cfe/trunk/lib/Sema/SemaType.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?rev=104169&r1=104168&r2=104169&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaType.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaType.cpp Wed May 19 16:37:53 2010
> @@ -25,6 +25,8 @@
> #include "llvm/Support/ErrorHandling.h"
> using namespace clang;
>
> +#include <iostream>
> +
> /// \brief Perform adjustment on the parameter type of a function.
> ///
> /// This routine adjusts the given parameter type @p T to the actual
> @@ -1437,9 +1439,15 @@
> return;
> }
>
> - TemplateSpecializationTypeLoc OldTL =
> - cast<TemplateSpecializationTypeLoc>(TInfo->getTypeLoc());
> - TL.copy(OldTL);
> + 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));
> }
> void VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
> assert(DS.getTypeSpecType() == DeclSpec::TST_typeofExpr);
> @@ -1470,6 +1478,44 @@
> TL.setBuiltinLoc(DS.getTypeSpecWidthLoc());
> }
> }
> + void VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
> + ElaboratedTypeKeyword Keyword
> + = TypeWithKeyword::getKeywordForTypeSpec(DS.getTypeSpecType());
> + if (Keyword == ETK_Typename) {
> + TypeSourceInfo *TInfo = 0;
> + Sema::GetTypeFromParser(DS.getTypeRep(), &TInfo);
> + if (TInfo) {
> + TL.copy(cast<ElaboratedTypeLoc>(TInfo->getTypeLoc()));
> + return;
> + }
> + }
> + TL.setKeywordLoc(Keyword != ETK_None
> + ? DS.getTypeSpecTypeLoc()
> + : SourceLocation());
> + const CXXScopeSpec& SS = DS.getTypeSpecScope();
> + TL.setQualifierRange(SS.isEmpty() ? SourceRange(): SS.getRange());
> + Visit(TL.getNextTypeLoc().getUnqualifiedLoc());
> + }
> + void VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
> + ElaboratedTypeKeyword Keyword
> + = TypeWithKeyword::getKeywordForTypeSpec(DS.getTypeSpecType());
> + if (Keyword == ETK_Typename) {
> + TypeSourceInfo *TInfo = 0;
> + Sema::GetTypeFromParser(DS.getTypeRep(), &TInfo);
> + if (TInfo) {
> + TL.copy(cast<DependentNameTypeLoc>(TInfo->getTypeLoc()));
> + return;
> + }
> + }
> + TL.setKeywordLoc(Keyword != ETK_None
> + ? DS.getTypeSpecTypeLoc()
> + : SourceLocation());
> + const CXXScopeSpec& SS = DS.getTypeSpecScope();
> + TL.setQualifierRange(SS.isEmpty() ? SourceRange() : SS.getRange());
> + // FIXME: load appropriate source location.
> + TL.setNameLoc(DS.getTypeSpecTypeLoc());
> + }
> +
> void VisitTypeLoc(TypeLoc TL) {
> // FIXME: add other typespec types and change this to an assert.
> TL.initialize(DS.getTypeSpecTypeLoc());
> @@ -2081,7 +2127,7 @@
> if (T.isNull())
> return T;
> NestedNameSpecifier *NNS;
> - if (SS.isSet() && !SS.isInvalid())
> + if (SS.isValid())
> NNS = static_cast<NestedNameSpecifier *>(SS.getScopeRep());
> else {
> if (Keyword == ETK_None)
>
> Modified: cfe/trunk/lib/Sema/TreeTransform.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=104169&r1=104168&r2=104169&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/TreeTransform.h (original)
> +++ cfe/trunk/lib/Sema/TreeTransform.h Wed May 19 16:37:53 2010
> @@ -530,10 +530,9 @@
>
> /// \brief Build a new typename type that refers to a template-id.
> ///
> - /// By default, builds a new DependentNameType type from the
> - /// nested-name-specifier
> - /// and the given type. Subclasses may override this routine to provide
> - /// different behavior.
> + /// By default, builds a new DependentNameType type from the
> + /// nested-name-specifier and the given type. Subclasses may override
> + /// this routine to provide different behavior.
> QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
> NestedNameSpecifier *NNS, QualType T) {
> if (NNS->isDependent()) {
> @@ -551,15 +550,18 @@
> /// \brief Build a new typename type that refers to an identifier.
> ///
> /// By default, performs semantic analysis when building the typename type
> - /// (or qualified name type). Subclasses may override this routine to provide
> + /// (or elaborated type). Subclasses may override this routine to provide
> /// different behavior.
> - QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
> + QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
> NestedNameSpecifier *NNS,
> const IdentifierInfo *Id,
> - SourceRange SR) {
> + SourceLocation KeywordLoc,
> + SourceRange NNSRange,
> + SourceLocation IdLoc) {
> CXXScopeSpec SS;
> SS.setScopeRep(NNS);
> -
> + SS.setRange(NNSRange);
> +
> if (NNS->isDependent()) {
> // If the name is still dependent, just build a new dependent name type.
> if (!SemaRef.computeDeclContext(SS))
> @@ -567,14 +569,15 @@
> }
>
> if (Keyword == ETK_None || Keyword == ETK_Typename)
> - return SemaRef.CheckTypenameType(Keyword, NNS, *Id, SR);
> + return SemaRef.CheckTypenameType(Keyword, NNS, *Id,
> + KeywordLoc, NNSRange, IdLoc);
>
> TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
>
> - // We had a dependent elaborated-type-specifier that as been transformed
> + // We had a dependent elaborated-type-specifier that has been transformed
> // into a non-dependent elaborated-type-specifier. Find the tag we're
> // referring to.
> - LookupResult Result(SemaRef, Id, SR.getEnd(), Sema::LookupTagName);
> + LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
> DeclContext *DC = SemaRef.computeDeclContext(SS, false);
> if (!DC)
> return QualType();
> @@ -602,14 +605,13 @@
>
> if (!Tag) {
> // FIXME: Would be nice to highlight just the source range.
> - SemaRef.Diag(SR.getEnd(), diag::err_not_tag_in_scope)
> + SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
> << Kind << Id << DC;
> return QualType();
> }
>
> - // FIXME: Terrible location information
> - if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, SR.getEnd(), *Id)) {
> - SemaRef.Diag(SR.getBegin(), diag::err_use_with_wrong_tag) << Id;
> + if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, IdLoc, *Id)) {
> + SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
> SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
> return QualType();
> }
> @@ -3237,27 +3239,45 @@
> // NOTE: the qualifier in an ElaboratedType is optional.
> if (T->getQualifier() != 0) {
> NNS = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
> - SourceRange(),
> + TL.getQualifierRange(),
> ObjectType);
> if (!NNS)
> return QualType();
> }
>
> - QualType Named = getDerived().TransformType(T->getNamedType());
> - if (Named.isNull())
> - return QualType();
> + QualType NamedT;
> + // FIXME: this test is meant to workaround a problem (failing assertion)
> + // occurring if directly executing the code in the else branch.
> + if (isa<TemplateSpecializationTypeLoc>(TL.getNamedTypeLoc())) {
> + TemplateSpecializationTypeLoc OldNamedTL
> + = cast<TemplateSpecializationTypeLoc>(TL.getNamedTypeLoc());
> + const TemplateSpecializationType* OldTST
> + = OldNamedTL.getType()->getAs<TemplateSpecializationType>();
> + NamedT = TransformTemplateSpecializationType(OldTST, ObjectType);
> + if (NamedT.isNull())
> + return QualType();
> + TemplateSpecializationTypeLoc NewNamedTL
> + = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
> + NewNamedTL.copy(OldNamedTL);
> + }
> + else {
> + NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
> + if (NamedT.isNull())
> + return QualType();
> + }
>
> QualType Result = TL.getType();
> if (getDerived().AlwaysRebuild() ||
> NNS != T->getQualifier() ||
> - Named != T->getNamedType()) {
> - Result = getDerived().RebuildElaboratedType(T->getKeyword(), NNS, Named);
> + NamedT != T->getNamedType()) {
> + Result = getDerived().RebuildElaboratedType(T->getKeyword(), NNS, NamedT);
> if (Result.isNull())
> return QualType();
> }
>
> ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
> - NewTL.setNameLoc(TL.getNameLoc());
> + NewTL.setKeywordLoc(TL.getKeywordLoc());
> + NewTL.setQualifierRange(TL.getQualifierRange());
>
> return Result;
> }
> @@ -3268,11 +3288,9 @@
> QualType ObjectType) {
> DependentNameType *T = TL.getTypePtr();
>
> - /* FIXME: preserve source information better than this */
> - SourceRange SR(TL.getNameLoc());
> -
> NestedNameSpecifier *NNS
> - = getDerived().TransformNestedNameSpecifier(T->getQualifier(), SR,
> + = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
> + TL.getQualifierRange(),
> ObjectType);
> if (!NNS)
> return QualType();
> @@ -3290,18 +3308,38 @@
> NewTemplateId == QualType(TemplateId, 0))
> return QualType(T, 0);
>
> - Result = getDerived().RebuildDependentNameType(T->getKeyword(), NNS,
> + Result = getDerived().RebuildDependentNameType(T->getKeyword(), NNS,
> NewTemplateId);
> } else {
> - Result = getDerived().RebuildDependentNameType(T->getKeyword(), NNS,
> - T->getIdentifier(), SR);
> + Result = getDerived().RebuildDependentNameType(T->getKeyword(), NNS,
> + T->getIdentifier(),
> + TL.getKeywordLoc(),
> + TL.getQualifierRange(),
> + TL.getNameLoc());
> }
> 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<TemplateSpecializationType>(NamedT)) {
> + TemplateSpecializationTypeLoc NamedTLoc
> + = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
> + // FIXME: fill locations
> + NamedTLoc.initializeLocal(TL.getNameLoc());
> + } else {
> + TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
> + }
> + ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
> + NewTL.setKeywordLoc(TL.getKeywordLoc());
> + NewTL.setQualifierRange(TL.getQualifierRange());
> + }
> + else {
> + DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
> + NewTL.setKeywordLoc(TL.getKeywordLoc());
> + NewTL.setQualifierRange(TL.getQualifierRange());
> + NewTL.setNameLoc(TL.getNameLoc());
> + }
> return Result;
> }
>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list