forked from OSchip/llvm-project
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. llvm-svn: 175462
This commit is contained in:
parent
f666b761bd
commit
6adc78e0df
|
@ -594,7 +594,7 @@ bool RecursiveASTVisitor<Derived>::TraverseTypeLoc(TypeLoc TL) {
|
|||
#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>::TraverseLambdaExpr(LambdaExpr *S) {
|
|||
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) {
|
||||
|
|
|
@ -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,6 +302,15 @@ class ConcreteTypeLoc : public Base {
|
|||
return static_cast<const Derived*>(this);
|
||||
}
|
||||
|
||||
friend class TypeLoc;
|
||||
static bool isType(const TypeLoc *TL) {
|
||||
return Derived::classofType(TL->getTypePtr());
|
||||
}
|
||||
|
||||
static bool classofType(const Type *Ty) {
|
||||
return TypeClass::classof(Ty);
|
||||
}
|
||||
|
||||
public:
|
||||
unsigned getLocalDataSize() const {
|
||||
return sizeof(LocalData) + asDerived()->getExtraLocalDataSize();
|
||||
|
@ -289,17 +320,6 @@ public:
|
|||
return asDerived()->getLocalDataSize() + getInnerTypeSize();
|
||||
}
|
||||
|
||||
static bool classofType(const Type *Ty) {
|
||||
return TypeClass::classof(Ty);
|
||||
}
|
||||
|
||||
static bool classof(const TypeLoc *TL) {
|
||||
return Derived::classofType(TL->getTypePtr());
|
||||
}
|
||||
static bool classof(const UnqualTypeLoc *TL) {
|
||||
return Derived::classofType(TL->getTypePtr());
|
||||
}
|
||||
|
||||
TypeLoc getNextTypeLoc() const {
|
||||
return getNextTypeLoc(asDerived()->getInnerType());
|
||||
}
|
||||
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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(MigrationContext &MigrateCtx,
|
|||
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)
|
||||
|
|
|
@ -2957,8 +2957,8 @@ ASTContext::getTemplateSpecializationTypeInfo(TemplateName Name,
|
|||
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());
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -466,8 +466,8 @@ TemplateArgumentLoc::getPackExpansionPattern(SourceLocation &Ellipsis,
|
|||
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();
|
||||
|
|
|
@ -86,7 +86,7 @@ void TypeLoc::initializeImpl(ASTContext &Context, TypeLoc TL,
|
|||
#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() const {
|
|||
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() const {
|
|||
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::getWrittenTypeSpec() const {
|
|||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -5772,14 +5772,13 @@ static bool IsTailPaddedMemberArray(Sema &S, llvm::APInt Size,
|
|||
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;
|
||||
}
|
||||
|
|
|
@ -2147,36 +2147,35 @@ static std::string FormatFunctionParameter(ASTContext &Context,
|
|||
|
||||
// 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 FormatFunctionParameter(ASTContext &Context,
|
|||
// 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 += ")";
|
||||
|
|
|
@ -4066,29 +4066,29 @@ static QualType TryToFixInvalidVariablyModifiedType(QualType T,
|
|||
|
||||
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(const FunctionDecl *FD) {
|
|||
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(Scope *FnBodyScope, Decl *D) {
|
|||
// 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");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -3715,10 +3715,10 @@ static void handleGlobalAttr(Sema &S, Decl *D, const AttributeList &Attr) {
|
|||
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)
|
||||
|
|
|
@ -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(Scope *S, SourceLocation FriendLoc,
|
|||
|
||||
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(Scope *S, SourceLocation FriendLoc,
|
|||
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::checkThisInStaticMemberFunctionType(CXXMethodDecl *Method) {
|
|||
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::checkThisInStaticMemberFunctionType(CXXMethodDecl *Method) {
|
|||
// 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::checkThisInStaticMemberFunctionExceptionSpec(CXXMethodDecl *Method) {
|
|||
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()) {
|
||||
|
|
|
@ -294,8 +294,8 @@ bool Sema::CheckEquivalentExceptionSpec(FunctionDecl *Old, FunctionDecl *New) {
|
|||
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())
|
||||
|
|
|
@ -3836,9 +3836,9 @@ bool Sema::GatherArgumentsForCall(SourceLocation CallLoc,
|
|||
|
||||
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(SourceLocation CaretLoc, Declarator &ParamInfo,
|
|||
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
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -237,7 +237,7 @@ void Sema::DiagnoseUnusedExprResult(const Stmt *S) {
|
|||
|
||||
// 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());
|
||||
|
|
|
@ -6956,15 +6956,15 @@ Sema::ActOnTypenameType(Scope *S, SourceLocation TypenameLoc,
|
|||
|
||||
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(NestedNameSpecifierLoc NNS, const IdentifierInfo &II,
|
|||
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(NestedNameSpecifierLoc NNS, const IdentifierInfo &II,
|
|||
return false;
|
||||
|
||||
// Assume the first template argument is the condition.
|
||||
CondRange = EnableIfTSTLoc->getArgLoc(0).getSourceRange();
|
||||
CondRange = EnableIfTSTLoc.getArgLoc(0).getSourceRange();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -1566,10 +1566,10 @@ static bool NeedsInstantiationAsFunctionType(TypeSourceInfo *T) {
|
|||
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::SubstFunctionDeclType(TypeSourceInfo *T,
|
|||
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(ParmVarDecl *OldParm,
|
|||
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,
|
||||
|
|
|
@ -1706,7 +1706,7 @@ Decl *TemplateDeclInstantiator::VisitNonTypeTemplateParmDecl(
|
|||
// 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::SubstFunctionType(FunctionDecl *D,
|
|||
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::SubstFunctionType(FunctionDecl *D,
|
|||
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::SubstFunctionType(FunctionDecl *D,
|
|||
// 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);
|
||||
|
|
|
@ -462,7 +462,8 @@ TypeSourceInfo *Sema::CheckPackExpansion(TypeSourceInfo *Pattern,
|
|||
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.
|
||||
|
|
|
@ -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(Declarator &D, QualType T,
|
|||
|
||||
// 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();
|
||||
}
|
||||
|
|
|
@ -2817,8 +2817,8 @@ TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
|
|||
}
|
||||
// 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>::TransformTypeInObjectScope(TypeLoc TL,
|
|||
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>::TransformTypeInObjectScope(TypeLoc TL,
|
|||
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>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
|
|||
|
||||
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>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
|
|||
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>::TransformFunctionTypeParam(ParmVarDecl *OldParm,
|
|||
// 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>::TransformTypeTraitExpr(TypeTraitExpr *E) {
|
|||
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>::TransformTypeTraitExpr(TypeTraitExpr *E) {
|
|||
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);
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -671,10 +671,10 @@ bool CursorVisitor::VisitClassTemplateSpecializationDecl(
|
|||
// 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(FunctionDecl *ND) {
|
|||
// 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(FunctionDecl *ND) {
|
|||
// 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(VisitorWorkList &WL) {
|
|||
// 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)
|
||||
|
|
|
@ -890,7 +890,7 @@ CXCursor cxcursor::getTypeRefCursor(CXCursor cursor) {
|
|||
|
||||
if (const ElaboratedType *ElabT = Ty->getAs<ElaboratedType>()) {
|
||||
Ty = ElabT->getNamedType();
|
||||
ElaboratedTypeLoc ElabTL = cast<ElaboratedTypeLoc>(TL);
|
||||
ElaboratedTypeLoc ElabTL = TL.castAs<ElaboratedTypeLoc>();
|
||||
Loc = ElabTL.getNamedTypeLoc().getBeginLoc();
|
||||
}
|
||||
|
||||
|
|
|
@ -165,16 +165,16 @@ SourceLocation IndexingContext::CXXBasesListInfo::getBaseLoc(
|
|||
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;
|
||||
}
|
||||
|
|
|
@ -535,7 +535,7 @@ bool RecursiveASTVisitor<Derived>::TraverseTypeLoc(TypeLoc TL) {
|
|||
#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>::TraverseLambdaExpr(LambdaExpr *S) {
|
|||
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) {
|
||||
|
|
Loading…
Reference in New Issue