r175462 - Replace TypeLoc llvm::cast support to be well-defined.
Matthieu Monrocq
matthieu.monrocq at gmail.com
Tue Feb 19 10:02:25 PST 2013
On Mon, Feb 18, 2013 at 11:06 PM, David Blaikie <dblaikie at gmail.com> wrote:
> Author: dblaikie
> Date: Mon Feb 18 16:06:02 2013
> New Revision: 175462
>
> URL: http://llvm.org/viewvc/llvm-project?rev=175462&view=rev
> Log:
> Replace TypeLoc llvm::cast support to be well-defined.
>
> The TypeLoc hierarchy used the llvm::cast machinery to perform undefined
> behavior by casting pointers/references to TypeLoc objects to derived types
> and then using the derived copy constructors (or even returning pointers to
> derived types that actually point to the original TypeLoc object).
>
> Some context is in this thread:
> http://lists.cs.uiuc.edu/pipermail/llvmdev/2012-December/056804.html
> Though it's spread over a few months which can be hard to read in the mail
> archive.
>
>
Great to see that cleanup patch landing!
> Modified:
> cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
> cfe/trunk/include/clang/AST/TypeLoc.h
> cfe/trunk/include/clang/AST/TypeLocVisitor.h
> cfe/trunk/lib/ARCMigrate/TransGCAttrs.cpp
> cfe/trunk/lib/AST/ASTContext.cpp
> cfe/trunk/lib/AST/Comment.cpp
> cfe/trunk/lib/AST/MicrosoftMangle.cpp
> cfe/trunk/lib/AST/TemplateBase.cpp
> cfe/trunk/lib/AST/TypeLoc.cpp
> cfe/trunk/lib/Sema/SemaChecking.cpp
> cfe/trunk/lib/Sema/SemaCodeComplete.cpp
> cfe/trunk/lib/Sema/SemaDecl.cpp
> cfe/trunk/lib/Sema/SemaDeclAttr.cpp
> cfe/trunk/lib/Sema/SemaDeclCXX.cpp
> cfe/trunk/lib/Sema/SemaExceptionSpec.cpp
> cfe/trunk/lib/Sema/SemaExpr.cpp
> cfe/trunk/lib/Sema/SemaInit.cpp
> cfe/trunk/lib/Sema/SemaStmt.cpp
> cfe/trunk/lib/Sema/SemaTemplate.cpp
> cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp
> cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.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/tools/libclang/CIndex.cpp
> cfe/trunk/tools/libclang/CXCursor.cpp
> cfe/trunk/tools/libclang/IndexingContext.cpp
> cfe/trunk/tools/libclang/RecursiveASTVisitor.h
>
> Modified: cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/RecursiveASTVisitor.h?rev=175462&r1=175461&r2=175462&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/AST/RecursiveASTVisitor.h (original)
> +++ cfe/trunk/include/clang/AST/RecursiveASTVisitor.h Mon Feb 18 16:06:02
> 2013
> @@ -594,7 +594,7 @@ bool RecursiveASTVisitor<Derived>::Trave
> #define ABSTRACT_TYPELOC(CLASS, BASE)
> #define TYPELOC(CLASS, BASE) \
> case TypeLoc::CLASS: \
> - return
> getDerived().Traverse##CLASS##TypeLoc(*cast<CLASS##TypeLoc>(&TL));
> + return
> getDerived().Traverse##CLASS##TypeLoc(TL.castAs<CLASS##TypeLoc>());
> #include "clang/AST/TypeLocNodes.def"
> }
>
> @@ -2100,8 +2100,7 @@ bool RecursiveASTVisitor<Derived>::Trave
> if (S->hasExplicitParameters() && S->hasExplicitResultType()) {
> // Visit the whole type.
> TRY_TO(TraverseTypeLoc(TL));
> - } else if (isa<FunctionProtoTypeLoc>(TL)) {
> - FunctionProtoTypeLoc Proto = cast<FunctionProtoTypeLoc>(TL);
> + } else if (FunctionProtoTypeLoc Proto =
> TL.getAs<FunctionProtoTypeLoc>()) {
> if (S->hasExplicitParameters()) {
> // Visit parameters.
> for (unsigned I = 0, N = Proto.getNumArgs(); I != N; ++I) {
>
> Modified: cfe/trunk/include/clang/AST/TypeLoc.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/TypeLoc.h?rev=175462&r1=175461&r2=175462&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/AST/TypeLoc.h (original)
> +++ cfe/trunk/include/clang/AST/TypeLoc.h Mon Feb 18 16:06:02 2013
> @@ -44,6 +44,28 @@ protected:
> void *Data;
>
> public:
> + template<typename T>
> + T castAs() const {
> + assert(T::isType(this));
> + T t;
> + TypeLoc& tl = t;
> + tl = *this;
> + return t;
> + }
> + template<typename T>
> + T getAs() const {
> + if (!T::isType(this))
> + return T();
> + T t;
> + TypeLoc& tl = t;
> + tl = *this;
> + return t;
> + }
> +
> + static bool isType(const TypeLoc*) {
> + return true;
> + }
> +
> /// The kinds of TypeLocs. Equivalent to the Type::TypeClass enum,
> /// except it also defines a Qualified enum that corresponds to the
> /// QualifiedLoc class.
> @@ -119,11 +141,7 @@ public:
> /// \brief Skips past any qualifiers, if this is qualified.
> UnqualTypeLoc getUnqualifiedLoc() const; // implemented in this header
>
> - TypeLoc IgnoreParens() const {
> - if (isa<ParenTypeLoc>(this))
> - return IgnoreParensImpl(*this);
> - return *this;
> - }
> + TypeLoc IgnoreParens() const;
>
> /// \brief Initializes this to state that every location in this
> /// type is the given location.
> @@ -187,7 +205,9 @@ public:
> return (TypeLocClass) getTypePtr()->getTypeClass();
> }
>
> - static bool classof(const TypeLoc *TL) {
> +private:
> + friend class TypeLoc;
> + static bool isType(const TypeLoc *TL) {
> return !TL->getType().hasLocalQualifiers();
> }
> };
> @@ -231,15 +251,17 @@ public:
> getFullDataSizeForType(getType().getLocalUnqualifiedType());
> }
>
> - static bool classof(const TypeLoc *TL) {
> +private:
> + friend class TypeLoc;
> + static bool isType(const TypeLoc *TL) {
> return TL->getType().hasLocalQualifiers();
> }
> };
>
> inline UnqualTypeLoc TypeLoc::getUnqualifiedLoc() const {
> - if (isa<QualifiedTypeLoc>(this))
> - return cast<QualifiedTypeLoc>(this)->getUnqualifiedLoc();
> - return cast<UnqualTypeLoc>(*this);
> + if (QualifiedTypeLoc Loc = getAs<QualifiedTypeLoc>())
> + return Loc.getUnqualifiedLoc();
> + return castAs<UnqualTypeLoc>();
> }
>
> /// A metaprogramming base class for TypeLoc classes which correspond
> @@ -280,24 +302,22 @@ class ConcreteTypeLoc : public Base {
> return static_cast<const Derived*>(this);
> }
>
> -public:
> - unsigned getLocalDataSize() const {
> - return sizeof(LocalData) + asDerived()->getExtraLocalDataSize();
> - }
> - // Give a default implementation that's useful for leaf types.
> - unsigned getFullDataSize() const {
> - return asDerived()->getLocalDataSize() + getInnerTypeSize();
> + friend class TypeLoc;
> + static bool isType(const TypeLoc *TL) {
> + return Derived::classofType(TL->getTypePtr());
> }
>
> static bool classofType(const Type *Ty) {
> return TypeClass::classof(Ty);
> }
>
> - static bool classof(const TypeLoc *TL) {
> - return Derived::classofType(TL->getTypePtr());
> +public:
> + unsigned getLocalDataSize() const {
> + return sizeof(LocalData) + asDerived()->getExtraLocalDataSize();
> }
> - static bool classof(const UnqualTypeLoc *TL) {
> - return Derived::classofType(TL->getTypePtr());
> + // Give a default implementation that's useful for leaf types.
> + unsigned getFullDataSize() const {
> + return asDerived()->getLocalDataSize() + getInnerTypeSize();
> }
>
> TypeLoc getNextTypeLoc() const {
> @@ -362,18 +382,19 @@ private:
> /// information. See the note on ConcreteTypeLoc.
> template <class Base, class Derived, class TypeClass>
> class InheritingConcreteTypeLoc : public Base {
> -public:
> + friend class TypeLoc;
> static bool classofType(const Type *Ty) {
> return TypeClass::classof(Ty);
> }
>
> - static bool classof(const TypeLoc *TL) {
> + static bool isType(const TypeLoc *TL) {
> return Derived::classofType(TL->getTypePtr());
> }
> - static bool classof(const UnqualTypeLoc *TL) {
> + static bool isType(const UnqualTypeLoc *TL) {
> return Derived::classofType(TL->getTypePtr());
> }
>
> +public:
> const TypeClass *getTypePtr() const {
> return cast<TypeClass>(Base::getTypePtr());
> }
> @@ -406,7 +427,9 @@ public:
> setNameLoc(Loc);
> }
>
> - static bool classof(const TypeLoc *TL);
> +private:
> + friend class TypeLoc;
> + static bool isType(const TypeLoc *TL);
> };
>
>
> @@ -899,6 +922,11 @@ public:
> }
> };
>
> +inline TypeLoc TypeLoc::IgnoreParens() const {
> + if (ParenTypeLoc::isType(this))
> + return IgnoreParensImpl(*this);
> + return *this;
> +}
>
> struct PointerLikeLocInfo {
> SourceLocation StarLoc;
>
> Modified: cfe/trunk/include/clang/AST/TypeLocVisitor.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/TypeLocVisitor.h?rev=175462&r1=175461&r2=175462&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/AST/TypeLocVisitor.h (original)
> +++ cfe/trunk/include/clang/AST/TypeLocVisitor.h Mon Feb 18 16:06:02 2013
> @@ -21,7 +21,7 @@ namespace clang {
>
> #define DISPATCH(CLASSNAME) \
> return static_cast<ImplClass*>(this)-> \
> - Visit##CLASSNAME(cast<CLASSNAME>(TyLoc))
> + Visit##CLASSNAME(TyLoc.castAs<CLASSNAME>())
>
> template<typename ImplClass, typename RetTy=void>
> class TypeLocVisitor {
>
> Modified: cfe/trunk/lib/ARCMigrate/TransGCAttrs.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ARCMigrate/TransGCAttrs.cpp?rev=175462&r1=175461&r2=175462&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/ARCMigrate/TransGCAttrs.cpp (original)
> +++ cfe/trunk/lib/ARCMigrate/TransGCAttrs.cpp Mon Feb 18 16:06:02 2013
> @@ -63,19 +63,18 @@ public:
> return;
> TypeLoc TL = TInfo->getTypeLoc();
> while (TL) {
> - if (const QualifiedTypeLoc *QL = dyn_cast<QualifiedTypeLoc>(&TL)) {
> - TL = QL->getUnqualifiedLoc();
> - } else if (const AttributedTypeLoc *
> - Attr = dyn_cast<AttributedTypeLoc>(&TL)) {
> - if (handleAttr(*Attr, D))
> + if (QualifiedTypeLoc QL = TL.getAs<QualifiedTypeLoc>()) {
> + TL = QL.getUnqualifiedLoc();
> + } else if (AttributedTypeLoc Attr = TL.getAs<AttributedTypeLoc>()) {
> + if (handleAttr(Attr, D))
> break;
> - TL = Attr->getModifiedLoc();
> - } else if (const ArrayTypeLoc *Arr = dyn_cast<ArrayTypeLoc>(&TL)) {
> - TL = Arr->getElementLoc();
> - } else if (const PointerTypeLoc *PT =
> dyn_cast<PointerTypeLoc>(&TL)) {
> - TL = PT->getPointeeLoc();
> - } else if (const ReferenceTypeLoc *RT =
> dyn_cast<ReferenceTypeLoc>(&TL))
> - TL = RT->getPointeeLoc();
> + TL = Attr.getModifiedLoc();
> + } else if (ArrayTypeLoc Arr = TL.getAs<ArrayTypeLoc>()) {
> + TL = Arr.getElementLoc();
> + } else if (PointerTypeLoc PT = TL.getAs<PointerTypeLoc>()) {
> + TL = PT.getPointeeLoc();
> + } else if (ReferenceTypeLoc RT = TL.getAs<ReferenceTypeLoc>())
> + TL = RT.getPointeeLoc();
> else
> break;
> }
> @@ -249,8 +248,9 @@ static void checkAllAtProps(MigrationCon
> if (!TInfo)
> return;
> TypeLoc TL = TInfo->getTypeLoc();
> - if (AttributedTypeLoc *ATL = dyn_cast<AttributedTypeLoc>(&TL)) {
> - ATLs.push_back(std::make_pair(*ATL, PD));
> + if (AttributedTypeLoc ATL =
> + TL.getAs<AttributedTypeLoc>()) {
> + ATLs.push_back(std::make_pair(ATL, PD));
> if (TInfo->getType().getObjCLifetime() == Qualifiers::OCL_Weak) {
> hasWeak = true;
> } else if (TInfo->getType().getObjCLifetime() ==
> Qualifiers::OCL_Strong)
>
> Modified: cfe/trunk/lib/AST/ASTContext.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=175462&r1=175461&r2=175462&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/AST/ASTContext.cpp (original)
> +++ cfe/trunk/lib/AST/ASTContext.cpp Mon Feb 18 16:06:02 2013
> @@ -2957,8 +2957,8 @@ ASTContext::getTemplateSpecializationTyp
> QualType TST = getTemplateSpecializationType(Name, Args, Underlying);
>
> TypeSourceInfo *DI = CreateTypeSourceInfo(TST);
> - TemplateSpecializationTypeLoc TL
> - = cast<TemplateSpecializationTypeLoc>(DI->getTypeLoc());
> + TemplateSpecializationTypeLoc TL =
> + DI->getTypeLoc().castAs<TemplateSpecializationTypeLoc>();
> TL.setTemplateKeywordLoc(SourceLocation());
> TL.setTemplateNameLoc(NameLoc);
> TL.setLAngleLoc(Args.getLAngleLoc());
>
> Modified: cfe/trunk/lib/AST/Comment.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Comment.cpp?rev=175462&r1=175461&r2=175462&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/AST/Comment.cpp (original)
> +++ cfe/trunk/lib/AST/Comment.cpp Mon Feb 18 16:06:02 2013
> @@ -241,32 +241,32 @@ void DeclInfo::fill() {
> while (true) {
> TL = TL.IgnoreParens();
> // Look through qualified types.
> - if (QualifiedTypeLoc *QualifiedTL =
> dyn_cast<QualifiedTypeLoc>(&TL)) {
> - TL = QualifiedTL->getUnqualifiedLoc();
> + if (QualifiedTypeLoc QualifiedTL = TL.getAs<QualifiedTypeLoc>()) {
> + TL = QualifiedTL.getUnqualifiedLoc();
> continue;
> }
> // Look through pointer types.
> - if (PointerTypeLoc *PointerTL = dyn_cast<PointerTypeLoc>(&TL)) {
> - TL = PointerTL->getPointeeLoc().getUnqualifiedLoc();
> + if (PointerTypeLoc PointerTL = TL.getAs<PointerTypeLoc>()) {
> + TL = PointerTL.getPointeeLoc().getUnqualifiedLoc();
> continue;
> }
> - if (BlockPointerTypeLoc *BlockPointerTL =
> - dyn_cast<BlockPointerTypeLoc>(&TL)) {
> - TL = BlockPointerTL->getPointeeLoc().getUnqualifiedLoc();
> + if (BlockPointerTypeLoc BlockPointerTL =
> + TL.getAs<BlockPointerTypeLoc>()) {
> + TL = BlockPointerTL.getPointeeLoc().getUnqualifiedLoc();
> continue;
> }
> - if (MemberPointerTypeLoc *MemberPointerTL =
> - dyn_cast<MemberPointerTypeLoc>(&TL)) {
> - TL = MemberPointerTL->getPointeeLoc().getUnqualifiedLoc();
> + if (MemberPointerTypeLoc MemberPointerTL =
> + TL.getAs<MemberPointerTypeLoc>()) {
> + TL = MemberPointerTL.getPointeeLoc().getUnqualifiedLoc();
> continue;
> }
> // Is this a typedef for a function type?
> - if (FunctionTypeLoc *FTL = dyn_cast<FunctionTypeLoc>(&TL)) {
> + if (FunctionTypeLoc FTL = TL.getAs<FunctionTypeLoc>()) {
> Kind = FunctionKind;
> - ArrayRef<ParmVarDecl *> Params = FTL->getParams();
> + ArrayRef<ParmVarDecl *> Params = FTL.getParams();
> ParamVars = ArrayRef<const ParmVarDecl *>(Params.data(),
> Params.size());
> - ResultType = FTL->getResultLoc().getType();
> + ResultType = FTL.getResultLoc().getType();
> break;
> }
> break;
>
> Modified: cfe/trunk/lib/AST/MicrosoftMangle.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/MicrosoftMangle.cpp?rev=175462&r1=175461&r2=175462&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/AST/MicrosoftMangle.cpp (original)
> +++ cfe/trunk/lib/AST/MicrosoftMangle.cpp Mon Feb 18 16:06:02 2013
> @@ -396,7 +396,7 @@ isTemplate(const NamedDecl *ND,
> TypeSourceInfo *TSI = Spec->getTypeAsWritten();
> if (TSI) {
> TemplateSpecializationTypeLoc TSTL =
> - cast<TemplateSpecializationTypeLoc>(TSI->getTypeLoc());
> + TSI->getTypeLoc().castAs<TemplateSpecializationTypeLoc>();
> TemplateArgumentListInfo LI(TSTL.getLAngleLoc(),
> TSTL.getRAngleLoc());
> for (unsigned i = 0, e = TSTL.getNumArgs(); i != e; ++i)
> TemplateArgs.push_back(TSTL.getArgLoc(i));
>
> Modified: cfe/trunk/lib/AST/TemplateBase.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/TemplateBase.cpp?rev=175462&r1=175461&r2=175462&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/AST/TemplateBase.cpp (original)
> +++ cfe/trunk/lib/AST/TemplateBase.cpp Mon Feb 18 16:06:02 2013
> @@ -466,8 +466,8 @@ TemplateArgumentLoc::getPackExpansionPat
> ExpansionTSInfo = Context.getTrivialTypeSourceInfo(
>
> getArgument().getAsType(),
> Ellipsis);
> - PackExpansionTypeLoc Expansion
> - = cast<PackExpansionTypeLoc>(ExpansionTSInfo->getTypeLoc());
> + PackExpansionTypeLoc Expansion =
> + ExpansionTSInfo->getTypeLoc().castAs<PackExpansionTypeLoc>();
> Ellipsis = Expansion.getEllipsisLoc();
>
> TypeLoc Pattern = Expansion.getPatternLoc();
>
> Modified: cfe/trunk/lib/AST/TypeLoc.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/TypeLoc.cpp?rev=175462&r1=175461&r2=175462&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/AST/TypeLoc.cpp (original)
> +++ cfe/trunk/lib/AST/TypeLoc.cpp Mon Feb 18 16:06:02 2013
> @@ -86,7 +86,7 @@ void TypeLoc::initializeImpl(ASTContext
> #define ABSTRACT_TYPELOC(CLASS, PARENT)
> #define TYPELOC(CLASS, PARENT) \
> case CLASS: { \
> - CLASS##TypeLoc TLCasted = cast<CLASS##TypeLoc>(TL); \
> + CLASS##TypeLoc TLCasted = TL.castAs<CLASS##TypeLoc>(); \
> TLCasted.initializeLocal(Context, Loc); \
> TL = TLCasted.getNextTypeLoc(); \
> if (!TL) return; \
> @@ -106,7 +106,8 @@ SourceLocation TypeLoc::getBeginLoc() co
> LeftMost = Cur;
> break;
> case FunctionProto:
> - if
> (cast<FunctionProtoTypeLoc>(&Cur)->getTypePtr()->hasTrailingReturn()) {
> + if (Cur.castAs<FunctionProtoTypeLoc>().getTypePtr()
> + ->hasTrailingReturn()) {
> LeftMost = Cur;
> break;
> }
> @@ -151,7 +152,7 @@ SourceLocation TypeLoc::getEndLoc() cons
> Last = Cur;
> break;
> case FunctionProto:
> - if
> (cast<FunctionProtoTypeLoc>(&Cur)->getTypePtr()->hasTrailingReturn())
> + if
> (Cur.castAs<FunctionProtoTypeLoc>().getTypePtr()->hasTrailingReturn())
> Last = TypeLoc();
> else
> Last = Cur;
> @@ -198,7 +199,7 @@ namespace {
> /// because it's a convenient base class. Ideally we would not accept
> /// those here, but ideally we would have better implementations for
> /// them.
> -bool TypeSpecTypeLoc::classof(const TypeLoc *TL) {
> +bool TypeSpecTypeLoc::isType(const TypeLoc *TL) {
> if (TL->getType().hasLocalQualifiers()) return false;
> return TSTChecker().Visit(*TL);
> }
> @@ -278,8 +279,8 @@ TypeSpecifierType BuiltinTypeLoc::getWri
> }
>
> TypeLoc TypeLoc::IgnoreParensImpl(TypeLoc TL) {
> - while (ParenTypeLoc* PTL = dyn_cast<ParenTypeLoc>(&TL))
> - TL = PTL->getInnerLoc();
> + while (ParenTypeLoc PTL = TL.getAs<ParenTypeLoc>())
> + TL = PTL.getInnerLoc();
> return TL;
> }
>
>
> Modified: cfe/trunk/lib/Sema/SemaChecking.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=175462&r1=175461&r2=175462&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaChecking.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaChecking.cpp Mon Feb 18 16:06:02 2013
> @@ -5772,14 +5772,13 @@ static bool IsTailPaddedMemberArray(Sema
> while (TInfo) {
> TypeLoc TL = TInfo->getTypeLoc();
> // Look through typedefs.
> - const TypedefTypeLoc *TTL = dyn_cast<TypedefTypeLoc>(&TL);
> - if (TTL) {
> - const TypedefNameDecl *TDL = TTL->getTypedefNameDecl();
> + if (TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>()) {
> + const TypedefNameDecl *TDL = TTL.getTypedefNameDecl();
> TInfo = TDL->getTypeSourceInfo();
> continue;
> }
> - if (const ConstantArrayTypeLoc *CTL =
> dyn_cast<ConstantArrayTypeLoc>(&TL)) {
> - const Expr *SizeExpr = dyn_cast<IntegerLiteral>(CTL->getSizeExpr());
> + if (ConstantArrayTypeLoc CTL = TL.getAs<ConstantArrayTypeLoc>()) {
> + const Expr *SizeExpr = dyn_cast<IntegerLiteral>(CTL.getSizeExpr());
> if (!SizeExpr || SizeExpr->getExprLoc().isMacroID())
> return false;
> }
>
> Modified: cfe/trunk/lib/Sema/SemaCodeComplete.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCodeComplete.cpp?rev=175462&r1=175461&r2=175462&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaCodeComplete.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaCodeComplete.cpp Mon Feb 18 16:06:02 2013
> @@ -2147,36 +2147,35 @@ static std::string FormatFunctionParamet
>
> // The argument for a block pointer parameter is a block literal with
> // the appropriate type.
> - FunctionTypeLoc *Block = 0;
> - FunctionProtoTypeLoc *BlockProto = 0;
> + FunctionTypeLoc Block;
> + FunctionProtoTypeLoc BlockProto;
> TypeLoc TL;
> if (TypeSourceInfo *TSInfo = Param->getTypeSourceInfo()) {
> TL = TSInfo->getTypeLoc().getUnqualifiedLoc();
> while (true) {
> // Look through typedefs.
> if (!SuppressBlock) {
> - if (TypedefTypeLoc *TypedefTL = dyn_cast<TypedefTypeLoc>(&TL)) {
> - if (TypeSourceInfo *InnerTSInfo
> - = TypedefTL->getTypedefNameDecl()->getTypeSourceInfo()) {
> + if (TypedefTypeLoc TypedefTL = TL.getAs<TypedefTypeLoc>()) {
> + if (TypeSourceInfo *InnerTSInfo =
> + TypedefTL.getTypedefNameDecl()->getTypeSourceInfo()) {
> TL = InnerTSInfo->getTypeLoc().getUnqualifiedLoc();
> continue;
> }
> }
>
> // Look through qualified types
> - if (QualifiedTypeLoc *QualifiedTL =
> dyn_cast<QualifiedTypeLoc>(&TL)) {
> - TL = QualifiedTL->getUnqualifiedLoc();
> + if (QualifiedTypeLoc QualifiedTL = TL.getAs<QualifiedTypeLoc>()) {
> + TL = QualifiedTL.getUnqualifiedLoc();
> continue;
> }
> }
>
> // Try to get the function prototype behind the block pointer type,
> // then we're done.
> - if (BlockPointerTypeLoc *BlockPtr
> - = dyn_cast<BlockPointerTypeLoc>(&TL)) {
> - TL = BlockPtr->getPointeeLoc().IgnoreParens();
> - Block = dyn_cast<FunctionTypeLoc>(&TL);
> - BlockProto = dyn_cast<FunctionProtoTypeLoc>(&TL);
> + if (BlockPointerTypeLoc BlockPtr = TL.getAs<BlockPointerTypeLoc>())
> {
> + TL = BlockPtr.getPointeeLoc().IgnoreParens();
> + Block = TL.getAs<FunctionTypeLoc>();
> + BlockProto = TL.getAs<FunctionProtoTypeLoc>();
> }
> break;
> }
> @@ -2204,27 +2203,27 @@ static std::string FormatFunctionParamet
> // We have the function prototype behind the block pointer type, as it
> was
> // written in the source.
> std::string Result;
> - QualType ResultType = Block->getTypePtr()->getResultType();
> + QualType ResultType = Block.getTypePtr()->getResultType();
> if (!ResultType->isVoidType() || SuppressBlock)
> ResultType.getAsStringInternal(Result, Policy);
>
> // Format the parameter list.
> std::string Params;
> - if (!BlockProto || Block->getNumArgs() == 0) {
> - if (BlockProto && BlockProto->getTypePtr()->isVariadic())
> + if (!BlockProto || Block.getNumArgs() == 0) {
> + if (BlockProto && BlockProto.getTypePtr()->isVariadic())
> Params = "(...)";
> else
> Params = "(void)";
> } else {
> Params += "(";
> - for (unsigned I = 0, N = Block->getNumArgs(); I != N; ++I) {
> + for (unsigned I = 0, N = Block.getNumArgs(); I != N; ++I) {
> if (I)
> Params += ", ";
> - Params += FormatFunctionParameter(Context, Policy, Block->getArg(I),
> + Params += FormatFunctionParameter(Context, Policy, Block.getArg(I),
> /*SuppressName=*/false,
> /*SuppressBlock=*/true);
>
> - if (I == N - 1 && BlockProto->getTypePtr()->isVariadic())
> + if (I == N - 1 && BlockProto.getTypePtr()->isVariadic())
> Params += ", ...";
> }
> Params += ")";
>
> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=175462&r1=175461&r2=175462&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Mon Feb 18 16:06:02 2013
> @@ -4066,29 +4066,29 @@ static QualType TryToFixInvalidVariablyM
>
> static void
> FixInvalidVariablyModifiedTypeLoc(TypeLoc SrcTL, TypeLoc DstTL) {
> - if (PointerTypeLoc* SrcPTL = dyn_cast<PointerTypeLoc>(&SrcTL)) {
> - PointerTypeLoc* DstPTL = cast<PointerTypeLoc>(&DstTL);
> - FixInvalidVariablyModifiedTypeLoc(SrcPTL->getPointeeLoc(),
> - DstPTL->getPointeeLoc());
> - DstPTL->setStarLoc(SrcPTL->getStarLoc());
> + if (PointerTypeLoc SrcPTL = SrcTL.getAs<PointerTypeLoc>()) {
> + PointerTypeLoc DstPTL = DstTL.castAs<PointerTypeLoc>();
> + FixInvalidVariablyModifiedTypeLoc(SrcPTL.getPointeeLoc(),
> + DstPTL.getPointeeLoc());
> + DstPTL.setStarLoc(SrcPTL.getStarLoc());
> return;
> }
> - if (ParenTypeLoc* SrcPTL = dyn_cast<ParenTypeLoc>(&SrcTL)) {
> - ParenTypeLoc* DstPTL = cast<ParenTypeLoc>(&DstTL);
> - FixInvalidVariablyModifiedTypeLoc(SrcPTL->getInnerLoc(),
> - DstPTL->getInnerLoc());
> - DstPTL->setLParenLoc(SrcPTL->getLParenLoc());
> - DstPTL->setRParenLoc(SrcPTL->getRParenLoc());
> + if (ParenTypeLoc SrcPTL = SrcTL.getAs<ParenTypeLoc>()) {
> + ParenTypeLoc DstPTL = DstTL.castAs<ParenTypeLoc>();
> + FixInvalidVariablyModifiedTypeLoc(SrcPTL.getInnerLoc(),
> + DstPTL.getInnerLoc());
> + DstPTL.setLParenLoc(SrcPTL.getLParenLoc());
> + DstPTL.setRParenLoc(SrcPTL.getRParenLoc());
> return;
> }
> - ArrayTypeLoc* SrcATL = cast<ArrayTypeLoc>(&SrcTL);
> - ArrayTypeLoc* DstATL = cast<ArrayTypeLoc>(&DstTL);
> - TypeLoc SrcElemTL = SrcATL->getElementLoc();
> - TypeLoc DstElemTL = DstATL->getElementLoc();
> + ArrayTypeLoc SrcATL = SrcTL.castAs<ArrayTypeLoc>();
> + ArrayTypeLoc DstATL = DstTL.castAs<ArrayTypeLoc>();
> + TypeLoc SrcElemTL = SrcATL.getElementLoc();
> + TypeLoc DstElemTL = DstATL.getElementLoc();
> DstElemTL.initializeFullCopy(SrcElemTL);
> - DstATL->setLBracketLoc(SrcATL->getLBracketLoc());
> - DstATL->setSizeExpr(SrcATL->getSizeExpr());
> - DstATL->setRBracketLoc(SrcATL->getRBracketLoc());
> + DstATL.setLBracketLoc(SrcATL.getLBracketLoc());
> + DstATL.setSizeExpr(SrcATL.getSizeExpr());
> + DstATL.setRBracketLoc(SrcATL.getRBracketLoc());
> }
>
> /// Helper method to turn variable array types into constant array
> @@ -6600,12 +6600,12 @@ static SourceRange getResultSourceRange(
> return SourceRange();
>
> TypeLoc TL = TSI->getTypeLoc();
> - FunctionTypeLoc *FunctionTL = dyn_cast<FunctionTypeLoc>(&TL);
> + FunctionTypeLoc FunctionTL = TL.getAs<FunctionTypeLoc>();
> if (!FunctionTL)
> return SourceRange();
>
> - TypeLoc ResultTL = FunctionTL->getResultLoc();
> - if (isa<BuiltinTypeLoc>(ResultTL.getUnqualifiedLoc()))
> + TypeLoc ResultTL = FunctionTL.getResultLoc();
> + if (ResultTL.getUnqualifiedLoc().getAs<BuiltinTypeLoc>())
> return ResultTL.getSourceRange();
>
> return SourceRange();
> @@ -8291,11 +8291,11 @@ Decl *Sema::ActOnStartOfFunctionDef(Scop
> // but that could be a zero-parameter prototype
> TypeSourceInfo* TI =
> PossibleZeroParamPrototype->getTypeSourceInfo();
> TypeLoc TL = TI->getTypeLoc();
> - if (FunctionNoProtoTypeLoc* FTL =
> dyn_cast<FunctionNoProtoTypeLoc>(&TL))
> + if (FunctionNoProtoTypeLoc FTL = TL.getAs<FunctionNoProtoTypeLoc>())
> Diag(PossibleZeroParamPrototype->getLocation(),
> diag::note_declaration_not_a_prototype)
> << PossibleZeroParamPrototype
> - << FixItHint::CreateInsertion(FTL->getRParenLoc(), "void");
> + << FixItHint::CreateInsertion(FTL.getRParenLoc(), "void");
> }
> }
>
>
> Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=175462&r1=175461&r2=175462&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Mon Feb 18 16:06:02 2013
> @@ -3715,10 +3715,10 @@ static void handleGlobalAttr(Sema &S, De
> FunctionDecl *FD = cast<FunctionDecl>(D);
> if (!FD->getResultType()->isVoidType()) {
> TypeLoc TL = FD->getTypeSourceInfo()->getTypeLoc().IgnoreParens();
> - if (FunctionTypeLoc* FTL = dyn_cast<FunctionTypeLoc>(&TL)) {
> + if (FunctionTypeLoc FTL = TL.getAs<FunctionTypeLoc>()) {
> S.Diag(FD->getTypeSpecStartLoc(),
> diag::err_kern_type_not_void_return)
> << FD->getType()
> - <<
> FixItHint::CreateReplacement(FTL->getResultLoc().getSourceRange(),
> + <<
> FixItHint::CreateReplacement(FTL.getResultLoc().getSourceRange(),
> "void");
> } else {
> S.Diag(FD->getTypeSpecStartLoc(),
> diag::err_kern_type_not_void_return)
>
> Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=175462&r1=175461&r2=175462&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Mon Feb 18 16:06:02 2013
> @@ -3757,7 +3757,7 @@ struct CheckAbstractUsage {
> switch (TL.getTypeLocClass()) {
> #define ABSTRACT_TYPELOC(CLASS, PARENT)
> #define TYPELOC(CLASS, PARENT) \
> - case TypeLoc::CLASS: Check(cast<CLASS##TypeLoc>(TL), Sel); break;
> + case TypeLoc::CLASS: Check(TL.castAs<CLASS##TypeLoc>(), Sel); break;
> #include "clang/AST/TypeLocNodes.def"
> }
> }
> @@ -10432,15 +10432,16 @@ Decl *Sema::ActOnTemplatedFriendTag(Scop
>
> TypeSourceInfo *TSI = Context.CreateTypeSourceInfo(T);
> if (isa<DependentNameType>(T)) {
> - DependentNameTypeLoc TL =
> cast<DependentNameTypeLoc>(TSI->getTypeLoc());
> + DependentNameTypeLoc TL =
> + TSI->getTypeLoc().castAs<DependentNameTypeLoc>();
> TL.setElaboratedKeywordLoc(TagLoc);
> TL.setQualifierLoc(QualifierLoc);
> TL.setNameLoc(NameLoc);
> } else {
> - ElaboratedTypeLoc TL = cast<ElaboratedTypeLoc>(TSI->getTypeLoc());
> + ElaboratedTypeLoc TL =
> TSI->getTypeLoc().castAs<ElaboratedTypeLoc>();
> TL.setElaboratedKeywordLoc(TagLoc);
> TL.setQualifierLoc(QualifierLoc);
> - cast<TypeSpecTypeLoc>(TL.getNamedTypeLoc()).setNameLoc(NameLoc);
> + TL.getNamedTypeLoc().castAs<TypeSpecTypeLoc>().setNameLoc(NameLoc);
> }
>
> FriendDecl *Friend = FriendDecl::Create(Context, CurContext, NameLoc,
> @@ -10460,7 +10461,7 @@ Decl *Sema::ActOnTemplatedFriendTag(Scop
> ElaboratedTypeKeyword ETK =
> TypeWithKeyword::getKeywordForTagTypeKind(Kind);
> QualType T = Context.getDependentNameType(ETK, SS.getScopeRep(), Name);
> TypeSourceInfo *TSI = Context.CreateTypeSourceInfo(T);
> - DependentNameTypeLoc TL = cast<DependentNameTypeLoc>(TSI->getTypeLoc());
> + DependentNameTypeLoc TL =
> TSI->getTypeLoc().castAs<DependentNameTypeLoc>();
> TL.setElaboratedKeywordLoc(TagLoc);
> TL.setQualifierLoc(SS.getWithLocInContext(Context));
> TL.setNameLoc(NameLoc);
> @@ -11538,7 +11539,7 @@ bool Sema::checkThisInStaticMemberFuncti
> return false;
>
> TypeLoc TL = TSInfo->getTypeLoc();
> - FunctionProtoTypeLoc *ProtoTL = dyn_cast<FunctionProtoTypeLoc>(&TL);
> + FunctionProtoTypeLoc ProtoTL = TL.getAs<FunctionProtoTypeLoc>();
> if (!ProtoTL)
> return false;
>
> @@ -11549,12 +11550,12 @@ bool Sema::checkThisInStaticMemberFuncti
> // within a static member function as they are within a non-static
> member
> // function). [ Note: this is because declaration matching does not
> occur
> // until the complete declarator is known. - end note ]
> - const FunctionProtoType *Proto = ProtoTL->getTypePtr();
> + const FunctionProtoType *Proto = ProtoTL.getTypePtr();
> FindCXXThisExpr Finder(*this);
>
> // If the return type came after the cv-qualifier-seq, check it now.
> if (Proto->hasTrailingReturn() &&
> - !Finder.TraverseTypeLoc(ProtoTL->getResultLoc()))
> + !Finder.TraverseTypeLoc(ProtoTL.getResultLoc()))
> return true;
>
> // Check the exception specification.
> @@ -11570,11 +11571,11 @@ bool Sema::checkThisInStaticMemberFuncti
> return false;
>
> TypeLoc TL = TSInfo->getTypeLoc();
> - FunctionProtoTypeLoc *ProtoTL = dyn_cast<FunctionProtoTypeLoc>(&TL);
> + FunctionProtoTypeLoc ProtoTL = TL.getAs<FunctionProtoTypeLoc>();
> if (!ProtoTL)
> return false;
>
> - const FunctionProtoType *Proto = ProtoTL->getTypePtr();
> + const FunctionProtoType *Proto = ProtoTL.getTypePtr();
> FindCXXThisExpr Finder(*this);
>
> switch (Proto->getExceptionSpecType()) {
>
> Modified: cfe/trunk/lib/Sema/SemaExceptionSpec.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExceptionSpec.cpp?rev=175462&r1=175461&r2=175462&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaExceptionSpec.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExceptionSpec.cpp Mon Feb 18 16:06:02 2013
> @@ -294,8 +294,8 @@ bool Sema::CheckEquivalentExceptionSpec(
> SourceLocation FixItLoc;
> if (TypeSourceInfo *TSInfo = New->getTypeSourceInfo()) {
> TypeLoc TL = TSInfo->getTypeLoc().IgnoreParens();
> - if (const FunctionTypeLoc *FTLoc = dyn_cast<FunctionTypeLoc>(&TL))
> - FixItLoc = PP.getLocForEndOfToken(FTLoc->getLocalRangeEnd());
> + if (FunctionTypeLoc FTLoc = TL.getAs<FunctionTypeLoc>())
> + FixItLoc = PP.getLocForEndOfToken(FTLoc.getLocalRangeEnd());
> }
>
> if (FixItLoc.isInvalid())
>
> Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=175462&r1=175461&r2=175462&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Mon Feb 18 16:06:02 2013
> @@ -3836,9 +3836,9 @@ bool Sema::GatherArgumentsForCall(Source
>
> static void DiagnoseCalleeStaticArrayParam(Sema &S, ParmVarDecl *PVD) {
> TypeLoc TL = PVD->getTypeSourceInfo()->getTypeLoc();
> - if (ArrayTypeLoc *ATL = dyn_cast<ArrayTypeLoc>(&TL))
> + if (ArrayTypeLoc ATL = TL.getAs<ArrayTypeLoc>())
> S.Diag(PVD->getLocation(), diag::note_callee_static_array)
> - << ATL->getLocalSourceRange();
> + << ATL.getLocalSourceRange();
> }
>
> /// CheckStaticArrayArgument - If the given argument corresponds to a
> static
> @@ -9437,8 +9437,7 @@ void Sema::ActOnBlockArguments(SourceLoc
> FunctionProtoTypeLoc ExplicitSignature;
>
> TypeLoc tmp = Sig->getTypeLoc().IgnoreParens();
> - if (isa<FunctionProtoTypeLoc>(tmp)) {
> - ExplicitSignature = cast<FunctionProtoTypeLoc>(tmp);
> + if ((ExplicitSignature = tmp.getAs<FunctionProtoTypeLoc>())) {
>
> // Check whether that explicit signature was synthesized by
> // GetTypeForDeclarator. If so, don't save that as part of the
>
> Modified: cfe/trunk/lib/Sema/SemaInit.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaInit.cpp?rev=175462&r1=175461&r2=175462&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaInit.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaInit.cpp Mon Feb 18 16:06:02 2013
> @@ -4899,9 +4899,9 @@ InitializationSequence::Perform(Sema &S,
> if (DeclaratorDecl *DD = Entity.getDecl()) {
> if (TypeSourceInfo *TInfo = DD->getTypeSourceInfo()) {
> TypeLoc TL = TInfo->getTypeLoc();
> - if (IncompleteArrayTypeLoc *ArrayLoc
> - =
> dyn_cast<IncompleteArrayTypeLoc>(&TL))
> - Brackets = ArrayLoc->getBracketsRange();
> + if (IncompleteArrayTypeLoc ArrayLoc =
> + TL.getAs<IncompleteArrayTypeLoc>())
> + Brackets = ArrayLoc.getBracketsRange();
> }
> }
>
>
> Modified: cfe/trunk/lib/Sema/SemaStmt.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaStmt.cpp?rev=175462&r1=175461&r2=175462&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaStmt.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaStmt.cpp Mon Feb 18 16:06:02 2013
> @@ -237,7 +237,7 @@ void Sema::DiagnoseUnusedExprResult(cons
>
> // We really do want to use the non-canonical type here.
> if (T == Context.VoidPtrTy) {
> - PointerTypeLoc TL = cast<PointerTypeLoc>(TI->getTypeLoc());
> + PointerTypeLoc TL = TI->getTypeLoc().castAs<PointerTypeLoc>();
>
> Diag(Loc, diag::warn_unused_voidptr)
> << FixItHint::CreateRemoval(TL.getStarLoc());
>
> Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=175462&r1=175461&r2=175462&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaTemplate.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaTemplate.cpp Mon Feb 18 16:06:02 2013
> @@ -6956,15 +6956,15 @@ Sema::ActOnTypenameType(Scope *S, Source
>
> TypeSourceInfo *TSI = Context.CreateTypeSourceInfo(T);
> if (isa<DependentNameType>(T)) {
> - DependentNameTypeLoc TL =
> cast<DependentNameTypeLoc>(TSI->getTypeLoc());
> + DependentNameTypeLoc TL =
> TSI->getTypeLoc().castAs<DependentNameTypeLoc>();
> TL.setElaboratedKeywordLoc(TypenameLoc);
> TL.setQualifierLoc(QualifierLoc);
> TL.setNameLoc(IdLoc);
> } else {
> - ElaboratedTypeLoc TL = cast<ElaboratedTypeLoc>(TSI->getTypeLoc());
> + ElaboratedTypeLoc TL = TSI->getTypeLoc().castAs<ElaboratedTypeLoc>();
> TL.setElaboratedKeywordLoc(TypenameLoc);
> TL.setQualifierLoc(QualifierLoc);
> - cast<TypeSpecTypeLoc>(TL.getNamedTypeLoc()).setNameLoc(IdLoc);
> + TL.getNamedTypeLoc().castAs<TypeSpecTypeLoc>().setNameLoc(IdLoc);
> }
>
> return CreateParsedType(T, TSI);
> @@ -7054,12 +7054,12 @@ static bool isEnableIf(NestedNameSpecifi
> if (!NNS || !NNS.getNestedNameSpecifier()->getAsType())
> return false;
> TypeLoc EnableIfTy = NNS.getTypeLoc();
> - TemplateSpecializationTypeLoc *EnableIfTSTLoc =
> - dyn_cast<TemplateSpecializationTypeLoc>(&EnableIfTy);
> - if (!EnableIfTSTLoc || EnableIfTSTLoc->getNumArgs() == 0)
> + TemplateSpecializationTypeLoc EnableIfTSTLoc =
> + EnableIfTy.getAs<TemplateSpecializationTypeLoc>();
> + if (!EnableIfTSTLoc || EnableIfTSTLoc.getNumArgs() == 0)
> return false;
> const TemplateSpecializationType *EnableIfTST =
> - cast<TemplateSpecializationType>(EnableIfTSTLoc->getTypePtr());
> + cast<TemplateSpecializationType>(EnableIfTSTLoc.getTypePtr());
>
> // ... which names a complete class template declaration...
> const TemplateDecl *EnableIfDecl =
> @@ -7074,7 +7074,7 @@ static bool isEnableIf(NestedNameSpecifi
> return false;
>
> // Assume the first template argument is the condition.
> - CondRange = EnableIfTSTLoc->getArgLoc(0).getSourceRange();
> + CondRange = EnableIfTSTLoc.getArgLoc(0).getSourceRange();
> return true;
> }
>
>
> Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp?rev=175462&r1=175461&r2=175462&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp Mon Feb 18 16:06:02 2013
> @@ -1566,10 +1566,10 @@ static bool NeedsInstantiationAsFunction
> return true;
>
> TypeLoc TL = T->getTypeLoc().IgnoreParens();
> - if (!isa<FunctionProtoTypeLoc>(TL))
> + if (!TL.getAs<FunctionProtoTypeLoc>())
> return false;
>
> - FunctionProtoTypeLoc FP = cast<FunctionProtoTypeLoc>(TL);
> + FunctionProtoTypeLoc FP = TL.castAs<FunctionProtoTypeLoc>();
> for (unsigned I = 0, E = FP.getNumArgs(); I != E; ++I) {
> ParmVarDecl *P = FP.getArg(I);
>
> @@ -1613,9 +1613,9 @@ TypeSourceInfo *Sema::SubstFunctionDeclT
> TLB.reserve(TL.getFullDataSize());
>
> QualType Result;
> -
> - if (FunctionProtoTypeLoc *Proto = dyn_cast<FunctionProtoTypeLoc>(&TL)) {
> - Result = Instantiator.TransformFunctionProtoType(TLB, *Proto,
> ThisContext,
> +
> + if (FunctionProtoTypeLoc Proto = TL.getAs<FunctionProtoTypeLoc>()) {
> + Result = Instantiator.TransformFunctionProtoType(TLB, Proto,
> ThisContext,
> ThisTypeQuals);
> } else {
> Result = Instantiator.TransformType(TLB, TL);
> @@ -1635,9 +1635,8 @@ ParmVarDecl *Sema::SubstParmVarDecl(Parm
> TypeSourceInfo *NewDI = 0;
>
> TypeLoc OldTL = OldDI->getTypeLoc();
> - if (isa<PackExpansionTypeLoc>(OldTL)) {
> - PackExpansionTypeLoc ExpansionTL = cast<PackExpansionTypeLoc>(OldTL);
> -
> + if (PackExpansionTypeLoc ExpansionTL =
> OldTL.getAs<PackExpansionTypeLoc>()) {
> +
> // We have a function parameter pack. Substitute into the pattern of
> the
> // expansion.
> NewDI = SubstType(ExpansionTL.getPatternLoc(), TemplateArgs,
>
> Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp?rev=175462&r1=175461&r2=175462&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp Mon Feb 18 16:06:02
> 2013
> @@ -1706,7 +1706,7 @@ Decl *TemplateDeclInstantiator::VisitNon
> // The non-type template parameter pack's type is a pack expansion of
> types.
> // Determine whether we need to expand this parameter pack into
> separate
> // types.
> - PackExpansionTypeLoc Expansion = cast<PackExpansionTypeLoc>(TL);
> + PackExpansionTypeLoc Expansion = TL.castAs<PackExpansionTypeLoc>();
> TypeLoc Pattern = Expansion.getPatternLoc();
> SmallVector<UnexpandedParameterPack, 2> Unexpanded;
> SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
> @@ -2335,15 +2335,14 @@ TemplateDeclInstantiator::SubstFunctionT
> if (NewTInfo != OldTInfo) {
> // Get parameters from the new type info.
> TypeLoc OldTL = OldTInfo->getTypeLoc().IgnoreParens();
> - if (FunctionProtoTypeLoc *OldProtoLoc
> - =
> dyn_cast<FunctionProtoTypeLoc>(&OldTL)) {
> + if (FunctionProtoTypeLoc OldProtoLoc =
> + OldTL.getAs<FunctionProtoTypeLoc>()) {
> TypeLoc NewTL = NewTInfo->getTypeLoc().IgnoreParens();
> - FunctionProtoTypeLoc *NewProtoLoc =
> cast<FunctionProtoTypeLoc>(&NewTL);
> - assert(NewProtoLoc && "Missing prototype?");
> + FunctionProtoTypeLoc NewProtoLoc =
> NewTL.castAs<FunctionProtoTypeLoc>();
> unsigned NewIdx = 0;
> - for (unsigned OldIdx = 0, NumOldParams = OldProtoLoc->getNumArgs();
> + for (unsigned OldIdx = 0, NumOldParams = OldProtoLoc.getNumArgs();
> OldIdx != NumOldParams; ++OldIdx) {
> - ParmVarDecl *OldParam = OldProtoLoc->getArg(OldIdx);
> + ParmVarDecl *OldParam = OldProtoLoc.getArg(OldIdx);
> LocalInstantiationScope *Scope =
> SemaRef.CurrentInstantiationScope;
>
> llvm::Optional<unsigned> NumArgumentsInExpansion;
> @@ -2354,14 +2353,14 @@ TemplateDeclInstantiator::SubstFunctionT
> if (!NumArgumentsInExpansion) {
> // Simple case: normal parameter, or a parameter pack that's
> // instantiated to a (still-dependent) parameter pack.
> - ParmVarDecl *NewParam = NewProtoLoc->getArg(NewIdx++);
> + ParmVarDecl *NewParam = NewProtoLoc.getArg(NewIdx++);
> Params.push_back(NewParam);
> Scope->InstantiatedLocal(OldParam, NewParam);
> } else {
> // Parameter pack expansion: make the instantiation an argument
> pack.
> Scope->MakeInstantiatedLocalArgPack(OldParam);
> for (unsigned I = 0; I != *NumArgumentsInExpansion; ++I) {
> - ParmVarDecl *NewParam = NewProtoLoc->getArg(NewIdx++);
> + ParmVarDecl *NewParam = NewProtoLoc.getArg(NewIdx++);
> Params.push_back(NewParam);
> Scope->InstantiatedLocalPackArg(OldParam, NewParam);
> }
> @@ -2373,10 +2372,10 @@ TemplateDeclInstantiator::SubstFunctionT
> // substitution occurred. However, we still need to instantiate
> // the function parameters themselves.
> TypeLoc OldTL = OldTInfo->getTypeLoc().IgnoreParens();
> - if (FunctionProtoTypeLoc *OldProtoLoc
> - =
> dyn_cast<FunctionProtoTypeLoc>(&OldTL)) {
> - for (unsigned i = 0, i_end = OldProtoLoc->getNumArgs(); i != i_end;
> ++i) {
> - ParmVarDecl *Parm = VisitParmVarDecl(OldProtoLoc->getArg(i));
> + if (FunctionProtoTypeLoc OldProtoLoc =
> + OldTL.getAs<FunctionProtoTypeLoc>()) {
> + for (unsigned i = 0, i_end = OldProtoLoc.getNumArgs(); i != i_end;
> ++i) {
> + ParmVarDecl *Parm = VisitParmVarDecl(OldProtoLoc.getArg(i));
> if (!Parm)
> return 0;
> Params.push_back(Parm);
>
> Modified: cfe/trunk/lib/Sema/SemaTemplateVariadic.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateVariadic.cpp?rev=175462&r1=175461&r2=175462&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaTemplateVariadic.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaTemplateVariadic.cpp Mon Feb 18 16:06:02 2013
> @@ -462,7 +462,8 @@ TypeSourceInfo *Sema::CheckPackExpansion
> return 0;
>
> TypeSourceInfo *TSResult = Context.CreateTypeSourceInfo(Result);
> - PackExpansionTypeLoc TL =
> cast<PackExpansionTypeLoc>(TSResult->getTypeLoc());
> + PackExpansionTypeLoc TL =
> + TSResult->getTypeLoc().castAs<PackExpansionTypeLoc>();
> TL.setEllipsisLoc(EllipsisLoc);
>
> // Copy over the source-location information from the type.
>
> Modified: cfe/trunk/lib/Sema/SemaType.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?rev=175462&r1=175461&r2=175462&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaType.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaType.cpp Mon Feb 18 16:06:02 2013
> @@ -3208,13 +3208,13 @@ namespace {
>
> TypeLoc OldTL = TInfo->getTypeLoc();
> if (TInfo->getType()->getAs<ElaboratedType>()) {
> - ElaboratedTypeLoc ElabTL = cast<ElaboratedTypeLoc>(OldTL);
> - TemplateSpecializationTypeLoc NamedTL =
> - cast<TemplateSpecializationTypeLoc>(ElabTL.getNamedTypeLoc());
> + ElaboratedTypeLoc ElabTL = OldTL.castAs<ElaboratedTypeLoc>();
> + TemplateSpecializationTypeLoc NamedTL = ElabTL.getNamedTypeLoc()
> + .castAs<TemplateSpecializationTypeLoc>();
> TL.copy(NamedTL);
> }
> else
> - TL.copy(cast<TemplateSpecializationTypeLoc>(OldTL));
> + TL.copy(OldTL.castAs<TemplateSpecializationTypeLoc>());
> }
> void VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
> assert(DS.getTypeSpecType() == DeclSpec::TST_typeofExpr);
> @@ -3262,7 +3262,7 @@ namespace {
> TypeSourceInfo *TInfo = 0;
> Sema::GetTypeFromParser(DS.getRepAsType(), &TInfo);
> if (TInfo) {
> - TL.copy(cast<ElaboratedTypeLoc>(TInfo->getTypeLoc()));
> + TL.copy(TInfo->getTypeLoc().castAs<ElaboratedTypeLoc>());
> return;
> }
> }
> @@ -3278,7 +3278,7 @@ namespace {
> TypeSourceInfo *TInfo = 0;
> Sema::GetTypeFromParser(DS.getRepAsType(), &TInfo);
> assert(TInfo);
> - TL.copy(cast<DependentNameTypeLoc>(TInfo->getTypeLoc()));
> + TL.copy(TInfo->getTypeLoc().castAs<DependentNameTypeLoc>());
> }
> void VisitDependentTemplateSpecializationTypeLoc(
> DependentTemplateSpecializationTypeLoc
> TL) {
> @@ -3286,8 +3286,8 @@ namespace {
> TypeSourceInfo *TInfo = 0;
> Sema::GetTypeFromParser(DS.getRepAsType(), &TInfo);
> assert(TInfo);
> - TL.copy(cast<DependentTemplateSpecializationTypeLoc>(
> - TInfo->getTypeLoc()));
> + TL.copy(
> +
> TInfo->getTypeLoc().castAs<DependentTemplateSpecializationTypeLoc>());
> }
> void VisitTagTypeLoc(TagTypeLoc TL) {
> TL.setNameLoc(DS.getTypeSpecTypeNameLoc());
> @@ -3348,7 +3348,7 @@ namespace {
> case NestedNameSpecifier::Identifier:
> assert(isa<DependentNameType>(ClsTy) && "Unexpected TypeLoc");
> {
> - DependentNameTypeLoc DNTLoc = cast<DependentNameTypeLoc>(ClsTL);
> + DependentNameTypeLoc DNTLoc =
> ClsTL.castAs<DependentNameTypeLoc>();
> DNTLoc.setElaboratedKeywordLoc(SourceLocation());
> DNTLoc.setQualifierLoc(NNSLoc.getPrefix());
> DNTLoc.setNameLoc(NNSLoc.getLocalBeginLoc());
> @@ -3358,7 +3358,7 @@ namespace {
> case NestedNameSpecifier::TypeSpec:
> case NestedNameSpecifier::TypeSpecWithTemplate:
> if (isa<ElaboratedType>(ClsTy)) {
> - ElaboratedTypeLoc ETLoc = *cast<ElaboratedTypeLoc>(&ClsTL);
> + ElaboratedTypeLoc ETLoc = ClsTL.castAs<ElaboratedTypeLoc>();
> ETLoc.setElaboratedKeywordLoc(SourceLocation());
> ETLoc.setQualifierLoc(NNSLoc.getPrefix());
> TypeLoc NamedTL = ETLoc.getNamedTypeLoc();
> @@ -3437,13 +3437,12 @@ Sema::GetTypeSourceInfoForDeclarator(Dec
>
> // Handle parameter packs whose type is a pack expansion.
> if (isa<PackExpansionType>(T)) {
> - cast<PackExpansionTypeLoc>(CurrTL).setEllipsisLoc(D.getEllipsisLoc());
> +
> CurrTL.castAs<PackExpansionTypeLoc>().setEllipsisLoc(D.getEllipsisLoc());
> CurrTL = CurrTL.getNextTypeLoc().getUnqualifiedLoc();
> }
>
> for (unsigned i = 0, e = D.getNumTypeObjects(); i != e; ++i) {
> - while (isa<AttributedTypeLoc>(CurrTL)) {
> - AttributedTypeLoc TL = cast<AttributedTypeLoc>(CurrTL);
> + while (AttributedTypeLoc TL = CurrTL.getAs<AttributedTypeLoc>()) {
> fillAttributedTypeLoc(TL, D.getTypeObject(i).getAttrs());
> CurrTL = TL.getNextTypeLoc().getUnqualifiedLoc();
> }
>
> Modified: cfe/trunk/lib/Sema/TreeTransform.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=175462&r1=175461&r2=175462&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/TreeTransform.h (original)
> +++ cfe/trunk/lib/Sema/TreeTransform.h Mon Feb 18 16:06:02 2013
> @@ -2817,8 +2817,8 @@ TreeTransform<Derived>::TransformNestedN
> }
> // If the nested-name-specifier is an invalid type def, don't emit
> an
> // error because a previous error should have already been emitted.
> - TypedefTypeLoc* TTL = dyn_cast<TypedefTypeLoc>(&TL);
> - if (!TTL || !TTL->getTypedefNameDecl()->isInvalidDecl()) {
> + TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
> + if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
> SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
> << TL.getType() << SS.getRange();
> }
> @@ -3326,9 +3326,10 @@ QualType
> TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
> switch (T.getTypeLocClass()) {
> #define ABSTRACT_TYPELOC(CLASS, PARENT)
> -#define TYPELOC(CLASS, PARENT) \
> - case TypeLoc::CLASS: \
> - return getDerived().Transform##CLASS##Type(TLB,
> cast<CLASS##TypeLoc>(T));
> +#define TYPELOC(CLASS, PARENT)
> \
> + case TypeLoc::CLASS:
> \
> + return getDerived().Transform##CLASS##Type(TLB,
> \
> +
> T.castAs<CLASS##TypeLoc>());
> #include "clang/AST/TypeLocNodes.def"
> }
>
> @@ -3421,8 +3422,8 @@ TreeTransform<Derived>::TransformTypeInO
> QualType Result;
>
> if (isa<TemplateSpecializationType>(T)) {
> - TemplateSpecializationTypeLoc SpecTL
> - = cast<TemplateSpecializationTypeLoc>(TL);
> + TemplateSpecializationTypeLoc SpecTL =
> + TL.castAs<TemplateSpecializationTypeLoc>();
>
> TemplateName Template =
> getDerived().TransformTemplateName(SS,
> @@ -3435,8 +3436,8 @@ TreeTransform<Derived>::TransformTypeInO
> Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
> Template);
> } else if (isa<DependentTemplateSpecializationType>(T)) {
> - DependentTemplateSpecializationTypeLoc SpecTL
> - = cast<DependentTemplateSpecializationTypeLoc>(TL);
> + DependentTemplateSpecializationTypeLoc SpecTL =
> + TL.castAs<DependentTemplateSpecializationTypeLoc>();
>
> TemplateName Template
> = getDerived().RebuildTemplateName(SS,
> @@ -3478,8 +3479,8 @@ TreeTransform<Derived>::TransformTypeInO
>
> TypeLoc TL = TSInfo->getTypeLoc();
> if (isa<TemplateSpecializationType>(T)) {
> - TemplateSpecializationTypeLoc SpecTL
> - = cast<TemplateSpecializationTypeLoc>(TL);
> + TemplateSpecializationTypeLoc SpecTL =
> + TL.castAs<TemplateSpecializationTypeLoc>();
>
> TemplateName Template
> = getDerived().TransformTemplateName(SS,
> @@ -3492,8 +3493,8 @@ TreeTransform<Derived>::TransformTypeInO
> Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
> Template);
> } else if (isa<DependentTemplateSpecializationType>(T)) {
> - DependentTemplateSpecializationTypeLoc SpecTL
> - = cast<DependentTemplateSpecializationTypeLoc>(TL);
> + DependentTemplateSpecializationTypeLoc SpecTL =
> + TL.castAs<DependentTemplateSpecializationTypeLoc>();
>
> TemplateName Template
> = getDerived().RebuildTemplateName(SS,
> @@ -3959,7 +3960,7 @@ TreeTransform<Derived>::TransformFunctio
> // If we're substituting into a pack expansion type and we know the
> // length we want to expand to, just substitute for the pattern.
> TypeLoc OldTL = OldDI->getTypeLoc();
> - PackExpansionTypeLoc OldExpansionTL =
> cast<PackExpansionTypeLoc>(OldTL);
> + PackExpansionTypeLoc OldExpansionTL =
> OldTL.castAs<PackExpansionTypeLoc>();
>
> TypeLocBuilder TLB;
> TypeLoc NewTL = OldDI->getTypeLoc();
> @@ -4025,7 +4026,7 @@ bool TreeTransform<Derived>::
>
> // Find the parameter packs that could be expanded.
> TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
> - PackExpansionTypeLoc ExpansionTL = cast<PackExpansionTypeLoc>(TL);
> + PackExpansionTypeLoc ExpansionTL =
> TL.castAs<PackExpansionTypeLoc>();
> TypeLoc Pattern = ExpansionTL.getPatternLoc();
> SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
> assert(Unexpanded.size() > 0 && "Could not find parameter
> packs!");
> @@ -7608,7 +7609,7 @@ TreeTransform<Derived>::TransformTypeTra
> for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
> TypeSourceInfo *From = E->getArg(I);
> TypeLoc FromTL = From->getTypeLoc();
> - if (!isa<PackExpansionTypeLoc>(FromTL)) {
> + if (!FromTL.getAs<PackExpansionTypeLoc>()) {
> TypeLocBuilder TLB;
> TLB.reserve(FromTL.getFullDataSize());
> QualType To = getDerived().TransformType(TLB, FromTL);
> @@ -7627,7 +7628,7 @@ TreeTransform<Derived>::TransformTypeTra
> ArgChanged = true;
>
> // We have a pack expansion. Instantiate it.
> - PackExpansionTypeLoc ExpansionTL = cast<PackExpansionTypeLoc>(FromTL);
> + PackExpansionTypeLoc ExpansionTL =
> FromTL.castAs<PackExpansionTypeLoc>();
> TypeLoc PatternTL = ExpansionTL.getPatternLoc();
> SmallVector<UnexpandedParameterPack, 2> Unexpanded;
> SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
>
> Modified: cfe/trunk/lib/Sema/TypeLocBuilder.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TypeLocBuilder.h?rev=175462&r1=175461&r2=175462&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/TypeLocBuilder.h (original)
> +++ cfe/trunk/lib/Sema/TypeLocBuilder.h Mon Feb 18 16:06:02 2013
> @@ -75,7 +75,7 @@ class TypeLocBuilder {
> /// previously retrieved from this builder.
> TypeSpecTypeLoc pushTypeSpec(QualType T) {
> size_t LocalSize = TypeSpecTypeLoc::LocalDataSize;
> - return cast<TypeSpecTypeLoc>(pushImpl(T, LocalSize));
> + return pushImpl(T, LocalSize).castAs<TypeSpecTypeLoc>();
> }
>
> /// Resets this builder to the newly-initialized state.
> @@ -97,8 +97,8 @@ 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 = cast<TyLocType>(TypeLoc(T, 0)).getLocalDataSize();
> - return cast<TyLocType>(pushImpl(T, LocalSize));
> + size_t LocalSize = TypeLoc(T,
> 0).castAs<TyLocType>().getLocalDataSize();
> + return pushImpl(T, LocalSize).castAs<TyLocType>();
> }
>
> /// Creates a TypeSourceInfo for the given type.
>
> Modified: cfe/trunk/tools/libclang/CIndex.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=175462&r1=175461&r2=175462&view=diff
>
> ==============================================================================
> --- cfe/trunk/tools/libclang/CIndex.cpp (original)
> +++ cfe/trunk/tools/libclang/CIndex.cpp Mon Feb 18 16:06:02 2013
> @@ -671,10 +671,10 @@ bool CursorVisitor::VisitClassTemplateSp
> // Visit the template arguments used in the specialization.
> if (TypeSourceInfo *SpecType = D->getTypeAsWritten()) {
> TypeLoc TL = SpecType->getTypeLoc();
> - if (TemplateSpecializationTypeLoc *TSTLoc
> - = dyn_cast<TemplateSpecializationTypeLoc>(&TL)) {
> - for (unsigned I = 0, N = TSTLoc->getNumArgs(); I != N; ++I)
> - if (VisitTemplateArgumentLoc(TSTLoc->getArgLoc(I)))
> + if (TemplateSpecializationTypeLoc TSTLoc =
> + TL.getAs<TemplateSpecializationTypeLoc>()) {
> + for (unsigned I = 0, N = TSTLoc.getNumArgs(); I != N; ++I)
> + if (VisitTemplateArgumentLoc(TSTLoc.getArgLoc(I)))
> return true;
> }
> }
> @@ -750,12 +750,12 @@ bool CursorVisitor::VisitFunctionDecl(Fu
> // Visit the function declaration's syntactic components in the order
> // written. This requires a bit of work.
> TypeLoc TL = TSInfo->getTypeLoc().IgnoreParens();
> - FunctionTypeLoc *FTL = dyn_cast<FunctionTypeLoc>(&TL);
> + FunctionTypeLoc FTL = TL.getAs<FunctionTypeLoc>();
>
> // If we have a function declared directly (without the use of a
> typedef),
> // visit just the return type. Otherwise, just visit the function's
> type
> // now.
> - if ((FTL && !isa<CXXConversionDecl>(ND) &&
> Visit(FTL->getResultLoc())) ||
> + if ((FTL && !isa<CXXConversionDecl>(ND) && Visit(FTL.getResultLoc()))
> ||
> (!FTL && Visit(TL)))
> return true;
>
> @@ -771,7 +771,7 @@ bool CursorVisitor::VisitFunctionDecl(Fu
> // FIXME: Visit explicitly-specified template arguments!
>
> // Visit the function parameters, if we have a function type.
> - if (FTL && VisitFunctionTypeLoc(*FTL, true))
> + if (FTL && VisitFunctionTypeLoc(FTL, true))
> return true;
>
> // FIXME: Attributes?
> @@ -2360,8 +2360,8 @@ bool CursorVisitor::RunVisitorWorkList(V
> // Visit the whole type.
> if (Visit(TL))
> return true;
> - } else if (isa<FunctionProtoTypeLoc>(TL)) {
> - FunctionProtoTypeLoc Proto = cast<FunctionProtoTypeLoc>(TL);
> + } else if (FunctionProtoTypeLoc Proto =
> + TL.getAs<FunctionProtoTypeLoc>()) {
> if (E->hasExplicitParameters()) {
> // Visit parameters.
> for (unsigned I = 0, N = Proto.getNumArgs(); I != N; ++I)
>
> Modified: cfe/trunk/tools/libclang/CXCursor.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CXCursor.cpp?rev=175462&r1=175461&r2=175462&view=diff
>
> ==============================================================================
> --- cfe/trunk/tools/libclang/CXCursor.cpp (original)
> +++ cfe/trunk/tools/libclang/CXCursor.cpp Mon Feb 18 16:06:02 2013
> @@ -890,7 +890,7 @@ CXCursor cxcursor::getTypeRefCursor(CXCu
>
> if (const ElaboratedType *ElabT = Ty->getAs<ElaboratedType>()) {
> Ty = ElabT->getNamedType();
> - ElaboratedTypeLoc ElabTL = cast<ElaboratedTypeLoc>(TL);
> + ElaboratedTypeLoc ElabTL = TL.castAs<ElaboratedTypeLoc>();
> Loc = ElabTL.getNamedTypeLoc().getBeginLoc();
> }
>
>
> Modified: cfe/trunk/tools/libclang/IndexingContext.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/IndexingContext.cpp?rev=175462&r1=175461&r2=175462&view=diff
>
> ==============================================================================
> --- cfe/trunk/tools/libclang/IndexingContext.cpp (original)
> +++ cfe/trunk/tools/libclang/IndexingContext.cpp Mon Feb 18 16:06:02 2013
> @@ -165,16 +165,16 @@ SourceLocation IndexingContext::CXXBases
> if (TL.isNull())
> return Loc;
>
> - if (const QualifiedTypeLoc *QL = dyn_cast<QualifiedTypeLoc>(&TL))
> - TL = QL->getUnqualifiedLoc();
> + if (QualifiedTypeLoc QL = TL.getAs<QualifiedTypeLoc>())
> + TL = QL.getUnqualifiedLoc();
>
> - if (const ElaboratedTypeLoc *EL = dyn_cast<ElaboratedTypeLoc>(&TL))
> - return EL->getNamedTypeLoc().getBeginLoc();
> - if (const DependentNameTypeLoc *DL =
> dyn_cast<DependentNameTypeLoc>(&TL))
> - return DL->getNameLoc();
> - if (const DependentTemplateSpecializationTypeLoc *
> - DTL = dyn_cast<DependentTemplateSpecializationTypeLoc>(&TL))
> - return DTL->getTemplateNameLoc();
> + if (ElaboratedTypeLoc EL = TL.getAs<ElaboratedTypeLoc>())
> + return EL.getNamedTypeLoc().getBeginLoc();
> + if (DependentNameTypeLoc DL = TL.getAs<DependentNameTypeLoc>())
> + return DL.getNameLoc();
> + if (DependentTemplateSpecializationTypeLoc DTL =
> + TL.getAs<DependentTemplateSpecializationTypeLoc>())
> + return DTL.getTemplateNameLoc();
>
> return Loc;
> }
>
> Modified: cfe/trunk/tools/libclang/RecursiveASTVisitor.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/RecursiveASTVisitor.h?rev=175462&r1=175461&r2=175462&view=diff
>
> ==============================================================================
> --- cfe/trunk/tools/libclang/RecursiveASTVisitor.h (original)
> +++ cfe/trunk/tools/libclang/RecursiveASTVisitor.h Mon Feb 18 16:06:02 2013
> @@ -535,7 +535,7 @@ bool RecursiveASTVisitor<Derived>::Trave
> #define ABSTRACT_TYPELOC(CLASS, BASE)
> #define TYPELOC(CLASS, BASE) \
> case TypeLoc::CLASS: \
> - return
> getDerived().Traverse##CLASS##TypeLoc(*cast<CLASS##TypeLoc>(&TL));
> + return
> getDerived().Traverse##CLASS##TypeLoc(TL.castAs<CLASS##TypeLoc>());
> #include "clang/AST/TypeLocNodes.def"
> }
>
> @@ -2027,8 +2027,7 @@ bool RecursiveASTVisitor<Derived>::Trave
> if (S->hasExplicitParameters() && S->hasExplicitResultType()) {
> // Visit the whole type.
> TRY_TO(TraverseTypeLoc(TL));
> - } else if (isa<FunctionProtoTypeLoc>(TL)) {
> - FunctionProtoTypeLoc Proto = cast<FunctionProtoTypeLoc>(TL);
> + } else if (FunctionProtoTypeLoc Proto =
> TL.getAs<FunctionProtoTypeLoc>()) {
> if (S->hasExplicitParameters()) {
> // Visit parameters.
> for (unsigned I = 0, N = Proto.getNumArgs(); I != N; ++I) {
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130219/b7c57d58/attachment.html>
More information about the cfe-commits
mailing list