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