On Fri, Jun 7, 2013 at 10:31 PM, Eli Friedman <[email protected]>wrote:
> Author: efriedma > Date: Fri Jun 7 15:31:48 2013 > New Revision: 183563 > > URL: http://llvm.org/viewvc/llvm-project?rev=183563&view=rev > Log: > Re-commit r183466 with a fix to make the TypeLoc casting machinery work > correctly in the presence of qualified types. > > (I had to change the unittest because it was trying to cast a > QualifiedTypeLoc to TemplateSpecializationTypeLoc.) > That did work before though... Why doesn't that work any more? Cheers, /Manuel > > > Modified: > cfe/trunk/include/clang/AST/TypeLoc.h > cfe/trunk/lib/AST/TypeLoc.cpp > cfe/trunk/lib/Sema/CMakeLists.txt > cfe/trunk/lib/Sema/SemaLambda.cpp > cfe/trunk/lib/Sema/SemaTemplateVariadic.cpp > cfe/trunk/lib/Sema/SemaType.cpp > cfe/trunk/lib/Sema/TreeTransform.h > cfe/trunk/lib/Sema/TypeLocBuilder.h > cfe/trunk/unittests/AST/SourceLocationTest.cpp > > Modified: cfe/trunk/include/clang/AST/TypeLoc.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/TypeLoc.h?rev=183563&r1=183562&r2=183563&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/AST/TypeLoc.h (original) > +++ cfe/trunk/include/clang/AST/TypeLoc.h Fri Jun 7 15:31:48 2013 > @@ -95,6 +95,10 @@ public: > /// \brief Returns the size of type source info data block for the > given type. > static unsigned getFullDataSizeForType(QualType Ty); > > + /// \brief Returns the alignment of type source info data block for > + /// the given type. > + static unsigned getLocalAlignmentForType(QualType Ty); > + > /// \brief Get the type for which this source info wrapper provides > /// information. > QualType getType() const { > @@ -229,7 +233,11 @@ public: > } > > UnqualTypeLoc getUnqualifiedLoc() const { > - return UnqualTypeLoc(getTypePtr(), Data); > + unsigned align = > + TypeLoc::getLocalAlignmentForType(QualType(getTypePtr(), 0)); > + uintptr_t dataInt = reinterpret_cast<uintptr_t>(Data); > + dataInt = llvm::RoundUpToAlignment(dataInt, align); > + return UnqualTypeLoc(getTypePtr(), reinterpret_cast<void*>(dataInt)); > } > > /// Initializes the local data of this type source info block to > @@ -250,10 +258,11 @@ public: > return 0; > } > > - /// \brief Returns the size of the type source info data block. > - unsigned getFullDataSize() const { > - return getLocalDataSize() + > - getFullDataSizeForType(getType().getLocalUnqualifiedType()); > + /// \brief Returns the alignment of the type source info data block > that is > + /// specific to this type. > + unsigned getLocalDataAlignment() const { > + // We don't preserve any location information. > + return 1; > } > > private: > @@ -280,9 +289,6 @@ inline UnqualTypeLoc TypeLoc::getUnquali > /// \tparam LocalData the structure type of local location data for > /// this type > /// > -/// sizeof(LocalData) needs to be a multiple of sizeof(void*) or > -/// else the world will end. > -/// > /// TypeLocs with non-constant amounts of local data should override > /// getExtraLocalDataSize(); getExtraLocalData() will then point to > /// this extra memory. > @@ -309,7 +315,8 @@ class ConcreteTypeLoc : public Base { > > friend class TypeLoc; > static bool isKind(const TypeLoc &TL) { > - return Derived::classofType(TL.getTypePtr()); > + return !TL.getType().hasLocalQualifiers() && > + Derived::classofType(TL.getTypePtr()); > } > > static bool classofType(const Type *Ty) { > @@ -317,12 +324,16 @@ class ConcreteTypeLoc : public Base { > } > > public: > - unsigned getLocalDataSize() const { > - return sizeof(LocalData) + asDerived()->getExtraLocalDataSize(); > + unsigned getLocalDataAlignment() const { > + return std::max(llvm::alignOf<LocalData>(), > + asDerived()->getExtraLocalDataAlignment()); > } > - // Give a default implementation that's useful for leaf types. > - unsigned getFullDataSize() const { > - return asDerived()->getLocalDataSize() + getInnerTypeSize(); > + unsigned getLocalDataSize() const { > + unsigned size = sizeof(LocalData); > + unsigned extraAlign = asDerived()->getExtraLocalDataAlignment(); > + size = llvm::RoundUpToAlignment(size, extraAlign); > + size += asDerived()->getExtraLocalDataSize(); > + return size; > } > > TypeLoc getNextTypeLoc() const { > @@ -338,6 +349,10 @@ protected: > return 0; > } > > + unsigned getExtraLocalDataAlignment() const { > + return 1; > + } > + > LocalData *getLocalData() const { > return static_cast<LocalData*>(Base::Data); > } > @@ -346,11 +361,17 @@ protected: > /// local data that can't be captured in the Info (e.g. because it's > /// of variable size). > void *getExtraLocalData() const { > - return getLocalData() + 1; > + unsigned size = sizeof(LocalData); > + unsigned extraAlign = asDerived()->getExtraLocalDataAlignment(); > + size = llvm::RoundUpToAlignment(size, extraAlign); > + return reinterpret_cast<char*>(Base::Data) + size; > } > > void *getNonLocalData() const { > - return static_cast<char*>(Base::Data) + > asDerived()->getLocalDataSize(); > + uintptr_t data = reinterpret_cast<uintptr_t>(Base::Data); > + data += asDerived()->getLocalDataSize(); > + data = llvm::RoundUpToAlignment(data, getNextTypeAlign()); > + return reinterpret_cast<void*>(data); > } > > struct HasNoInnerType {}; > @@ -373,6 +394,18 @@ private: > return getInnerTypeLoc().getFullDataSize(); > } > > + unsigned getNextTypeAlign() const { > + return getNextTypeAlign(asDerived()->getInnerType()); > + } > + > + unsigned getNextTypeAlign(HasNoInnerType _) const { > + return 1; > + } > + > + unsigned getNextTypeAlign(QualType T) const { > + return TypeLoc::getLocalAlignmentForType(T); > + } > + > TypeLoc getNextTypeLoc(HasNoInnerType _) const { > return TypeLoc(); > } > @@ -393,7 +426,8 @@ class InheritingConcreteTypeLoc : public > } > > static bool isKind(const TypeLoc &TL) { > - return Derived::classofType(TL.getTypePtr()); > + return !TL.getType().hasLocalQualifiers() && > + Derived::classofType(TL.getTypePtr()); > } > static bool isKind(const UnqualTypeLoc &TL) { > return Derived::classofType(TL.getTypePtr()); > @@ -417,7 +451,8 @@ class TypeSpecTypeLoc : public ConcreteT > Type, > TypeSpecLocInfo> { > public: > - enum { LocalDataSize = sizeof(TypeSpecLocInfo) }; > + enum { LocalDataSize = sizeof(TypeSpecLocInfo), > + LocalDataAlignment = llvm::AlignOf<TypeSpecLocInfo>::Alignment }; > > SourceLocation getNameLoc() const { > return this->getLocalData()->NameLoc; > @@ -448,8 +483,6 @@ class BuiltinTypeLoc : public ConcreteTy > BuiltinType, > BuiltinLocInfo> { > public: > - enum { LocalDataSize = sizeof(BuiltinLocInfo) }; > - > SourceLocation getBuiltinLoc() const { > return getLocalData()->BuiltinLoc; > } > @@ -478,6 +511,10 @@ public: > return needsExtraLocalData() ? sizeof(WrittenBuiltinSpecs) : 0; > } > > + unsigned getExtraLocalDataAlignment() const { > + return needsExtraLocalData() ? llvm::alignOf<WrittenBuiltinSpecs>() : > 1; > + } > + > SourceRange getLocalSourceRange() const { > return SourceRange(getBuiltinLoc(), getBuiltinLoc()); > } > @@ -840,6 +877,10 @@ public: > return this->getNumProtocols() * sizeof(SourceLocation); > } > > + unsigned getExtraLocalDataAlignment() const { > + return llvm::alignOf<SourceLocation>(); > + } > + > QualType getInnerType() const { > return getTypePtr()->getBaseType(); > } > @@ -1166,6 +1207,10 @@ public: > return getNumArgs() * sizeof(ParmVarDecl*); > } > > + unsigned getExtraLocalDataAlignment() const { > + return llvm::alignOf<ParmVarDecl*>(); > + } > + > QualType getInnerType() const { return getTypePtr()->getResultType(); } > }; > > @@ -1357,6 +1402,10 @@ public: > return getNumArgs() * sizeof(TemplateArgumentLocInfo); > } > > + unsigned getExtraLocalDataAlignment() const { > + return llvm::alignOf<TemplateArgumentLocInfo>(); > + } > + > private: > TemplateArgumentLocInfo *getArgInfos() const { > return static_cast<TemplateArgumentLocInfo*>(getExtraLocalData()); > @@ -1761,6 +1810,10 @@ public: > return getNumArgs() * sizeof(TemplateArgumentLocInfo); > } > > + unsigned getExtraLocalDataAlignment() const { > + return llvm::alignOf<TemplateArgumentLocInfo>(); > + } > + > private: > TemplateArgumentLocInfo *getArgInfos() const { > return static_cast<TemplateArgumentLocInfo*>(getExtraLocalData()); > > Modified: cfe/trunk/lib/AST/TypeLoc.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/TypeLoc.cpp?rev=183563&r1=183562&r2=183563&view=diff > > ============================================================================== > --- cfe/trunk/lib/AST/TypeLoc.cpp (original) > +++ cfe/trunk/lib/AST/TypeLoc.cpp Fri Jun 7 15:31:48 2013 > @@ -41,12 +41,30 @@ SourceRange TypeLoc::getLocalSourceRange > } > > namespace { > + class TypeAligner : public TypeLocVisitor<TypeAligner, unsigned> { > + public: > +#define ABSTRACT_TYPELOC(CLASS, PARENT) > +#define TYPELOC(CLASS, PARENT) \ > + unsigned Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \ > + return TyLoc.getLocalDataAlignment(); \ > + } > +#include "clang/AST/TypeLocNodes.def" > + }; > +} > + > +/// \brief Returns the alignment of the type source info data block. > +unsigned TypeLoc::getLocalAlignmentForType(QualType Ty) { > + if (Ty.isNull()) return 1; > + return TypeAligner().Visit(TypeLoc(Ty, 0)); > +} > + > +namespace { > class TypeSizer : public TypeLocVisitor<TypeSizer, unsigned> { > public: > #define ABSTRACT_TYPELOC(CLASS, PARENT) > #define TYPELOC(CLASS, PARENT) \ > unsigned Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \ > - return TyLoc.getFullDataSize(); \ > + return TyLoc.getLocalDataSize(); \ > } > #include "clang/AST/TypeLocNodes.def" > }; > @@ -54,8 +72,18 @@ namespace { > > /// \brief Returns the size of the type source info data block. > unsigned TypeLoc::getFullDataSizeForType(QualType Ty) { > - if (Ty.isNull()) return 0; > - return TypeSizer().Visit(TypeLoc(Ty, 0)); > + unsigned Total = 0; > + TypeLoc TyLoc(Ty, 0); > + unsigned MaxAlign = 1; > + while (!TyLoc.isNull()) { > + unsigned Align = getLocalAlignmentForType(TyLoc.getType()); > + MaxAlign = std::max(Align, MaxAlign); > + Total = llvm::RoundUpToAlignment(Total, Align); > + Total += TypeSizer().Visit(TyLoc); > + TyLoc = TyLoc.getNextTypeLoc(); > + } > + Total = llvm::RoundUpToAlignment(Total, MaxAlign); > + return Total; > } > > namespace { > > Modified: cfe/trunk/lib/Sema/CMakeLists.txt > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/CMakeLists.txt?rev=183563&r1=183562&r2=183563&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/CMakeLists.txt (original) > +++ cfe/trunk/lib/Sema/CMakeLists.txt Fri Jun 7 15:31:48 2013 > @@ -51,6 +51,7 @@ add_clang_library(clangSema > SemaTemplateVariadic.cpp > SemaType.cpp > TargetAttributesSema.cpp > + TypeLocBuilder.cpp > ) > > add_dependencies(clangSema > > Modified: cfe/trunk/lib/Sema/SemaLambda.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaLambda.cpp?rev=183563&r1=183562&r2=183563&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/SemaLambda.cpp (original) > +++ cfe/trunk/lib/Sema/SemaLambda.cpp Fri Jun 7 15:31:48 2013 > @@ -445,6 +445,7 @@ FieldDecl *Sema::checkInitCapture(Source > assert(!DeductType.isNull() && "can't build reference to auto"); > TLB.push<ReferenceTypeLoc>(DeductType).setSigilLoc(Loc); > } > + TypeSourceInfo *TSI = TLB.getTypeSourceInfo(Context, DeductType); > > InitializationKind InitKind = InitializationKind::CreateDefault(Loc); > Expr *Init = InitExpr; > @@ -476,8 +477,7 @@ FieldDecl *Sema::checkInitCapture(Source > else > InitKind = InitializationKind::CreateCopy(Loc, Loc); > QualType DeducedType; > - if (DeduceAutoType(TLB.getTemporaryTypeLoc(DeductType), > - Init, DeducedType) == DAR_Failed) { > + if (DeduceAutoType(TSI, Init, DeducedType) == DAR_Failed) { > if (isa<InitListExpr>(Init)) > Diag(Loc, diag::err_init_capture_deduction_failure_from_init_list) > << Id << Init->getSourceRange(); > @@ -492,7 +492,7 @@ FieldDecl *Sema::checkInitCapture(Source > // the closure type. This member is not a bit-field and not mutable. > // Core issue: the member is (probably...) public. > FieldDecl *NewFD = CheckFieldDecl( > - Id, DeducedType, TLB.getTypeSourceInfo(Context, DeductType), > LSI->Lambda, > + Id, DeducedType, TSI, LSI->Lambda, > Loc, /*Mutable*/ false, /*BitWidth*/ 0, ICIS_NoInit, > Loc, AS_public, /*PrevDecl*/ 0, /*Declarator*/ 0); > LSI->Lambda->addDecl(NewFD); > > Modified: cfe/trunk/lib/Sema/SemaTemplateVariadic.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateVariadic.cpp?rev=183563&r1=183562&r2=183563&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/SemaTemplateVariadic.cpp (original) > +++ cfe/trunk/lib/Sema/SemaTemplateVariadic.cpp Fri Jun 7 15:31:48 2013 > @@ -18,6 +18,7 @@ > #include "clang/Sema/ScopeInfo.h" > #include "clang/Sema/SemaInternal.h" > #include "clang/Sema/Template.h" > +#include "TypeLocBuilder.h" > > using namespace clang; > > @@ -463,17 +464,13 @@ Sema::CheckPackExpansion(TypeSourceInfo > EllipsisLoc, NumExpansions); > if (Result.isNull()) > return 0; > - > - TypeSourceInfo *TSResult = Context.CreateTypeSourceInfo(Result); > - PackExpansionTypeLoc TL = > - TSResult->getTypeLoc().castAs<PackExpansionTypeLoc>(); > + > + TypeLocBuilder TLB; > + TLB.pushFullCopy(Pattern->getTypeLoc()); > + PackExpansionTypeLoc TL = TLB.push<PackExpansionTypeLoc>(Result); > TL.setEllipsisLoc(EllipsisLoc); > - > - // Copy over the source-location information from the type. > - memcpy(TL.getNextTypeLoc().getOpaqueData(), > - Pattern->getTypeLoc().getOpaqueData(), > - Pattern->getTypeLoc().getFullDataSize()); > - return TSResult; > + > + return TLB.getTypeSourceInfo(Context, Result); > } > > QualType Sema::CheckPackExpansion(QualType Pattern, SourceRange > PatternRange, > > Modified: cfe/trunk/lib/Sema/SemaType.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?rev=183563&r1=183562&r2=183563&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/SemaType.cpp (original) > +++ cfe/trunk/lib/Sema/SemaType.cpp Fri Jun 7 15:31:48 2013 > @@ -3418,9 +3418,11 @@ namespace { > TemplateSpecializationTypeLoc NamedTL = ElabTL.getNamedTypeLoc() > .castAs<TemplateSpecializationTypeLoc>(); > TL.copy(NamedTL); > - } > - else > + } else { > TL.copy(OldTL.castAs<TemplateSpecializationTypeLoc>()); > + assert(TL.getRAngleLoc() == > OldTL.castAs<TemplateSpecializationTypeLoc>().getRAngleLoc()); > + } > + > } > void VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) { > assert(DS.getTypeSpecType() == DeclSpec::TST_typeofExpr); > > Modified: cfe/trunk/lib/Sema/TreeTransform.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=183563&r1=183562&r2=183563&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/TreeTransform.h (original) > +++ cfe/trunk/lib/Sema/TreeTransform.h Fri Jun 7 15:31:48 2013 > @@ -3427,7 +3427,7 @@ TreeTransform<Derived>::TransformQualifi > } else { > // Otherwise, complain about the addition of a qualifier to an > // already-qualified type. > - SourceRange R = TLB.getTemporaryTypeLoc(Result).getSourceRange(); > + SourceRange R = T.getUnqualifiedLoc().getSourceRange(); > SemaRef.Diag(R.getBegin(), > diag::err_attr_objc_ownership_redundant) > << Result << R; > > > Modified: cfe/trunk/lib/Sema/TypeLocBuilder.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TypeLocBuilder.h?rev=183563&r1=183562&r2=183563&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/TypeLocBuilder.h (original) > +++ cfe/trunk/lib/Sema/TypeLocBuilder.h Fri Jun 7 15:31:48 2013 > @@ -39,14 +39,19 @@ class TypeLocBuilder { > #endif > > /// The inline buffer. > - char InlineBuffer[InlineCapacity]; > + enum { BufferMaxAlignment = llvm::AlignOf<void*>::Alignment }; > + llvm::AlignedCharArray<BufferMaxAlignment, InlineCapacity> InlineBuffer; > + unsigned NumBytesAtAlign4, NumBytesAtAlign8; > > public: > TypeLocBuilder() > - : Buffer(InlineBuffer), Capacity(InlineCapacity), > Index(InlineCapacity) {} > + : Buffer(InlineBuffer.buffer), Capacity(InlineCapacity), > + Index(InlineCapacity), NumBytesAtAlign4(0), NumBytesAtAlign8(0) > + { > + } > > ~TypeLocBuilder() { > - if (Buffer != InlineBuffer) > + if (Buffer != InlineBuffer.buffer) > delete[] Buffer; > } > > @@ -59,23 +64,14 @@ class TypeLocBuilder { > > /// Pushes a copy of the given TypeLoc onto this builder. The builder > /// must be empty for this to work. > - void pushFullCopy(TypeLoc L) { > - size_t Size = L.getFullDataSize(); > - TypeLoc Copy = pushFullUninitializedImpl(L.getType(), Size); > - memcpy(Copy.getOpaqueData(), L.getOpaqueData(), Size); > - } > - > - /// Pushes uninitialized space for the given type. The builder must > - /// be empty. > - TypeLoc pushFullUninitialized(QualType T) { > - return pushFullUninitializedImpl(T, > TypeLoc::getFullDataSizeForType(T)); > - } > + void pushFullCopy(TypeLoc L); > > /// Pushes space for a typespec TypeLoc. Invalidates any TypeLocs > /// previously retrieved from this builder. > TypeSpecTypeLoc pushTypeSpec(QualType T) { > size_t LocalSize = TypeSpecTypeLoc::LocalDataSize; > - return pushImpl(T, LocalSize).castAs<TypeSpecTypeLoc>(); > + unsigned LocalAlign = TypeSpecTypeLoc::LocalDataAlignment; > + return pushImpl(T, LocalSize, LocalAlign).castAs<TypeSpecTypeLoc>(); > } > > /// Resets this builder to the newly-initialized state. > @@ -84,6 +80,7 @@ class TypeLocBuilder { > LastTy = QualType(); > #endif > Index = Capacity; > + NumBytesAtAlign4 = NumBytesAtAlign8 = 0; > } > > /// \brief Tell the TypeLocBuilder that the type it is storing has been > @@ -97,8 +94,10 @@ class TypeLocBuilder { > /// Pushes space for a new TypeLoc of the given type. Invalidates > /// any TypeLocs previously retrieved from this builder. > template <class TyLocType> TyLocType push(QualType T) { > - size_t LocalSize = TypeLoc(T, > 0).castAs<TyLocType>().getLocalDataSize(); > - return pushImpl(T, LocalSize).castAs<TyLocType>(); > + TyLocType Loc = TypeLoc(T, 0).castAs<TyLocType>(); > + size_t LocalSize = Loc.getLocalDataSize(); > + unsigned LocalAlign = Loc.getLocalDataAlignment(); > + return pushImpl(T, LocalSize, LocalAlign).castAs<TyLocType>(); > } > > /// Creates a TypeSourceInfo for the given type. > @@ -127,61 +126,12 @@ class TypeLocBuilder { > } > > private: > - TypeLoc pushImpl(QualType T, size_t LocalSize) { > -#ifndef NDEBUG > - QualType TLast = TypeLoc(T, 0).getNextTypeLoc().getType(); > - assert(TLast == LastTy && > - "mismatch between last type and new type's inner type"); > - LastTy = T; > -#endif > - > - // If we need to grow, grow by a factor of 2. > - if (LocalSize > Index) { > - size_t RequiredCapacity = Capacity + (LocalSize - Index); > - size_t NewCapacity = Capacity * 2; > - while (RequiredCapacity > NewCapacity) > - NewCapacity *= 2; > - grow(NewCapacity); > - } > > - Index -= LocalSize; > - > - return getTemporaryTypeLoc(T); > - } > + TypeLoc pushImpl(QualType T, size_t LocalSize, unsigned LocalAlignment); > > /// Grow to the given capacity. > - void grow(size_t NewCapacity) { > - assert(NewCapacity > Capacity); > - > - // Allocate the new buffer and copy the old data into it. > - char *NewBuffer = new char[NewCapacity]; > - unsigned NewIndex = Index + NewCapacity - Capacity; > - memcpy(&NewBuffer[NewIndex], > - &Buffer[Index], > - Capacity - Index); > - > - if (Buffer != InlineBuffer) > - delete[] Buffer; > - > - Buffer = NewBuffer; > - Capacity = NewCapacity; > - Index = NewIndex; > - } > - > - TypeLoc pushFullUninitializedImpl(QualType T, size_t Size) { > -#ifndef NDEBUG > - assert(LastTy.isNull() && "pushing full on non-empty TypeLocBuilder"); > - LastTy = T; > -#endif > - assert(Index == Capacity && "pushing full on non-empty > TypeLocBuilder"); > - > - reserve(Size); > - Index -= Size; > - > - return getTemporaryTypeLoc(T); > - } > + void grow(size_t NewCapacity); > > -public: > /// \brief Retrieve a temporary TypeLoc that refers into this \c > TypeLocBuilder > /// object. > /// > > Modified: cfe/trunk/unittests/AST/SourceLocationTest.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/AST/SourceLocationTest.cpp?rev=183563&r1=183562&r2=183563&view=diff > > ============================================================================== > --- cfe/trunk/unittests/AST/SourceLocationTest.cpp (original) > +++ cfe/trunk/unittests/AST/SourceLocationTest.cpp Fri Jun 7 15:31:48 2013 > @@ -159,7 +159,7 @@ class TemplateAngleBracketLocRangeVerifi > protected: > virtual SourceRange getRange(const TypeLoc &Node) { > TemplateSpecializationTypeLoc T = > - Node.castAs<TemplateSpecializationTypeLoc>(); > + Node.getUnqualifiedLoc().castAs<TemplateSpecializationTypeLoc>(); > assert(!T.isNull()); > return SourceRange(T.getLAngleLoc(), T.getRAngleLoc()); > } > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
