|
@@ -47,14 +47,14 @@ class CXXOperatorCallExpr : public CallExpr {
|
|
|
OverloadedOperatorKind Operator;
|
|
|
|
|
|
public:
|
|
|
- CXXOperatorCallExpr(ASTContext& C, OverloadedOperatorKind Op, Expr *fn,
|
|
|
- Expr **args, unsigned numargs, QualType t,
|
|
|
+ CXXOperatorCallExpr(ASTContext& C, OverloadedOperatorKind Op, Expr *fn,
|
|
|
+ Expr **args, unsigned numargs, QualType t,
|
|
|
SourceLocation operatorloc)
|
|
|
: CallExpr(C, CXXOperatorCallExprClass, fn, args, numargs, t, operatorloc),
|
|
|
Operator(Op) {}
|
|
|
- explicit CXXOperatorCallExpr(ASTContext& C, EmptyShell Empty) :
|
|
|
+ explicit CXXOperatorCallExpr(ASTContext& C, EmptyShell Empty) :
|
|
|
CallExpr(C, CXXOperatorCallExprClass, Empty) { }
|
|
|
-
|
|
|
+
|
|
|
|
|
|
/// getOperator - Returns the kind of overloaded operator that this
|
|
|
/// expression refers to.
|
|
@@ -69,9 +69,9 @@ public:
|
|
|
SourceLocation getOperatorLoc() const { return getRParenLoc(); }
|
|
|
|
|
|
virtual SourceRange getSourceRange() const;
|
|
|
-
|
|
|
- static bool classof(const Stmt *T) {
|
|
|
- return T->getStmtClass() == CXXOperatorCallExprClass;
|
|
|
+
|
|
|
+ static bool classof(const Stmt *T) {
|
|
|
+ return T->getStmtClass() == CXXOperatorCallExprClass;
|
|
|
}
|
|
|
static bool classof(const CXXOperatorCallExpr *) { return true; }
|
|
|
};
|
|
@@ -95,7 +95,7 @@ public:
|
|
|
/// operation would return "x".
|
|
|
Expr *getImplicitObjectArgument();
|
|
|
|
|
|
- static bool classof(const Stmt *T) {
|
|
|
+ static bool classof(const Stmt *T) {
|
|
|
return T->getStmtClass() == CXXMemberCallExprClass;
|
|
|
}
|
|
|
static bool classof(const CXXMemberCallExpr *) { return true; }
|
|
@@ -113,7 +113,7 @@ private:
|
|
|
SourceLocation Loc; // the location of the casting op
|
|
|
|
|
|
protected:
|
|
|
- CXXNamedCastExpr(StmtClass SC, QualType ty, const CastInfo &info, Expr *op,
|
|
|
+ CXXNamedCastExpr(StmtClass SC, QualType ty, const CastInfo &info, Expr *op,
|
|
|
QualType writtenTy, SourceLocation l)
|
|
|
: ExplicitCastExpr(SC, ty, info, op, writtenTy), Loc(l) {}
|
|
|
|
|
@@ -128,7 +128,7 @@ public:
|
|
|
virtual SourceRange getSourceRange() const {
|
|
|
return SourceRange(Loc, getSubExpr()->getSourceRange().getEnd());
|
|
|
}
|
|
|
- static bool classof(const Stmt *T) {
|
|
|
+ static bool classof(const Stmt *T) {
|
|
|
switch (T->getStmtClass()) {
|
|
|
case CXXNamedCastExprClass:
|
|
|
case CXXStaticCastExprClass:
|
|
@@ -144,34 +144,34 @@ public:
|
|
|
};
|
|
|
|
|
|
/// CXXStaticCastExpr - A C++ @c static_cast expression (C++ [expr.static.cast]).
|
|
|
-///
|
|
|
+///
|
|
|
/// This expression node represents a C++ static cast, e.g.,
|
|
|
/// @c static_cast<int>(1.0).
|
|
|
class CXXStaticCastExpr : public CXXNamedCastExpr {
|
|
|
public:
|
|
|
- CXXStaticCastExpr(QualType ty, const CastInfo &info, Expr *op,
|
|
|
+ CXXStaticCastExpr(QualType ty, const CastInfo &info, Expr *op,
|
|
|
QualType writtenTy, SourceLocation l)
|
|
|
: CXXNamedCastExpr(CXXStaticCastExprClass, ty, info, op, writtenTy, l) {}
|
|
|
|
|
|
- static bool classof(const Stmt *T) {
|
|
|
+ static bool classof(const Stmt *T) {
|
|
|
return T->getStmtClass() == CXXStaticCastExprClass;
|
|
|
}
|
|
|
static bool classof(const CXXStaticCastExpr *) { return true; }
|
|
|
};
|
|
|
|
|
|
/// CXXDynamicCastExpr - A C++ @c dynamic_cast expression
|
|
|
-/// (C++ [expr.dynamic.cast]), which may perform a run-time check to
|
|
|
+/// (C++ [expr.dynamic.cast]), which may perform a run-time check to
|
|
|
/// determine how to perform the type cast.
|
|
|
-///
|
|
|
+///
|
|
|
/// This expression node represents a dynamic cast, e.g.,
|
|
|
/// @c dynamic_cast<Derived*>(BasePtr).
|
|
|
class CXXDynamicCastExpr : public CXXNamedCastExpr {
|
|
|
public:
|
|
|
- CXXDynamicCastExpr(QualType ty, CastKind kind, Expr *op, QualType writtenTy,
|
|
|
+ CXXDynamicCastExpr(QualType ty, CastKind kind, Expr *op, QualType writtenTy,
|
|
|
SourceLocation l)
|
|
|
: CXXNamedCastExpr(CXXDynamicCastExprClass, ty, kind, op, writtenTy, l) {}
|
|
|
|
|
|
- static bool classof(const Stmt *T) {
|
|
|
+ static bool classof(const Stmt *T) {
|
|
|
return T->getStmtClass() == CXXDynamicCastExprClass;
|
|
|
}
|
|
|
static bool classof(const CXXDynamicCastExpr *) { return true; }
|
|
@@ -180,17 +180,17 @@ public:
|
|
|
/// CXXReinterpretCastExpr - A C++ @c reinterpret_cast expression (C++
|
|
|
/// [expr.reinterpret.cast]), which provides a differently-typed view
|
|
|
/// of a value but performs no actual work at run time.
|
|
|
-///
|
|
|
+///
|
|
|
/// This expression node represents a reinterpret cast, e.g.,
|
|
|
/// @c reinterpret_cast<int>(VoidPtr).
|
|
|
class CXXReinterpretCastExpr : public CXXNamedCastExpr {
|
|
|
public:
|
|
|
- CXXReinterpretCastExpr(QualType ty, Expr *op, QualType writtenTy,
|
|
|
+ CXXReinterpretCastExpr(QualType ty, Expr *op, QualType writtenTy,
|
|
|
SourceLocation l)
|
|
|
- : CXXNamedCastExpr(CXXReinterpretCastExprClass, ty, CK_BitCast, op,
|
|
|
+ : CXXNamedCastExpr(CXXReinterpretCastExprClass, ty, CK_BitCast, op,
|
|
|
writtenTy, l) {}
|
|
|
|
|
|
- static bool classof(const Stmt *T) {
|
|
|
+ static bool classof(const Stmt *T) {
|
|
|
return T->getStmtClass() == CXXReinterpretCastExprClass;
|
|
|
}
|
|
|
static bool classof(const CXXReinterpretCastExpr *) { return true; }
|
|
@@ -198,39 +198,39 @@ public:
|
|
|
|
|
|
/// CXXConstCastExpr - A C++ @c const_cast expression (C++ [expr.const.cast]),
|
|
|
/// which can remove type qualifiers but does not change the underlying value.
|
|
|
-///
|
|
|
+///
|
|
|
/// This expression node represents a const cast, e.g.,
|
|
|
/// @c const_cast<char*>(PtrToConstChar).
|
|
|
class CXXConstCastExpr : public CXXNamedCastExpr {
|
|
|
public:
|
|
|
- CXXConstCastExpr(QualType ty, Expr *op, QualType writtenTy,
|
|
|
+ CXXConstCastExpr(QualType ty, Expr *op, QualType writtenTy,
|
|
|
SourceLocation l)
|
|
|
: CXXNamedCastExpr(CXXConstCastExprClass, ty, CK_NoOp, op, writtenTy, l) {}
|
|
|
|
|
|
- static bool classof(const Stmt *T) {
|
|
|
+ static bool classof(const Stmt *T) {
|
|
|
return T->getStmtClass() == CXXConstCastExprClass;
|
|
|
}
|
|
|
static bool classof(const CXXConstCastExpr *) { return true; }
|
|
|
};
|
|
|
|
|
|
/// CXXBoolLiteralExpr - [C++ 2.13.5] C++ Boolean Literal.
|
|
|
-///
|
|
|
+///
|
|
|
class CXXBoolLiteralExpr : public Expr {
|
|
|
bool Value;
|
|
|
SourceLocation Loc;
|
|
|
public:
|
|
|
- CXXBoolLiteralExpr(bool val, QualType Ty, SourceLocation l) :
|
|
|
+ CXXBoolLiteralExpr(bool val, QualType Ty, SourceLocation l) :
|
|
|
Expr(CXXBoolLiteralExprClass, Ty), Value(val), Loc(l) {}
|
|
|
|
|
|
bool getValue() const { return Value; }
|
|
|
|
|
|
virtual SourceRange getSourceRange() const { return SourceRange(Loc); }
|
|
|
-
|
|
|
- static bool classof(const Stmt *T) {
|
|
|
+
|
|
|
+ static bool classof(const Stmt *T) {
|
|
|
return T->getStmtClass() == CXXBoolLiteralExprClass;
|
|
|
}
|
|
|
static bool classof(const CXXBoolLiteralExpr *) { return true; }
|
|
|
-
|
|
|
+
|
|
|
// Iterators
|
|
|
virtual child_iterator child_begin();
|
|
|
virtual child_iterator child_end();
|
|
@@ -322,7 +322,7 @@ class CXXThisExpr : public Expr {
|
|
|
SourceLocation Loc;
|
|
|
|
|
|
public:
|
|
|
- CXXThisExpr(SourceLocation L, QualType Type)
|
|
|
+ CXXThisExpr(SourceLocation L, QualType Type)
|
|
|
: Expr(CXXThisExprClass, Type,
|
|
|
// 'this' is type-dependent if the class type of the enclosing
|
|
|
// member function is dependent (C++ [temp.dep.expr]p2)
|
|
@@ -331,7 +331,7 @@ public:
|
|
|
|
|
|
virtual SourceRange getSourceRange() const { return SourceRange(Loc); }
|
|
|
|
|
|
- static bool classof(const Stmt *T) {
|
|
|
+ static bool classof(const Stmt *T) {
|
|
|
return T->getStmtClass() == CXXThisExprClass;
|
|
|
}
|
|
|
static bool classof(const CXXThisExpr *) { return true; }
|
|
@@ -383,14 +383,14 @@ public:
|
|
|
/// supply arguments for all of the parameters.
|
|
|
class CXXDefaultArgExpr : public Expr {
|
|
|
ParmVarDecl *Param;
|
|
|
-
|
|
|
+
|
|
|
protected:
|
|
|
- CXXDefaultArgExpr(StmtClass SC, ParmVarDecl *param)
|
|
|
- : Expr(SC, param->hasUnparsedDefaultArg() ?
|
|
|
+ CXXDefaultArgExpr(StmtClass SC, ParmVarDecl *param)
|
|
|
+ : Expr(SC, param->hasUnparsedDefaultArg() ?
|
|
|
param->getType().getNonReferenceType()
|
|
|
: param->getDefaultArg()->getType()),
|
|
|
Param(param) { }
|
|
|
-
|
|
|
+
|
|
|
public:
|
|
|
// Param is the parameter whose default argument is used by this
|
|
|
// expression.
|
|
@@ -426,39 +426,39 @@ public:
|
|
|
class CXXTemporary {
|
|
|
/// Destructor - The destructor that needs to be called.
|
|
|
const CXXDestructorDecl *Destructor;
|
|
|
-
|
|
|
+
|
|
|
CXXTemporary(const CXXDestructorDecl *destructor)
|
|
|
: Destructor(destructor) { }
|
|
|
~CXXTemporary() { }
|
|
|
|
|
|
public:
|
|
|
- static CXXTemporary *Create(ASTContext &C,
|
|
|
+ static CXXTemporary *Create(ASTContext &C,
|
|
|
const CXXDestructorDecl *Destructor);
|
|
|
-
|
|
|
+
|
|
|
void Destroy(ASTContext &Ctx);
|
|
|
-
|
|
|
+
|
|
|
const CXXDestructorDecl *getDestructor() const { return Destructor; }
|
|
|
};
|
|
|
|
|
|
-/// CXXBindTemporaryExpr - Represents binding an expression to a temporary,
|
|
|
+/// CXXBindTemporaryExpr - Represents binding an expression to a temporary,
|
|
|
/// so its destructor can be called later.
|
|
|
class CXXBindTemporaryExpr : public Expr {
|
|
|
CXXTemporary *Temp;
|
|
|
-
|
|
|
+
|
|
|
Stmt *SubExpr;
|
|
|
|
|
|
- CXXBindTemporaryExpr(CXXTemporary *temp, Expr* subexpr)
|
|
|
+ CXXBindTemporaryExpr(CXXTemporary *temp, Expr* subexpr)
|
|
|
: Expr(CXXBindTemporaryExprClass,
|
|
|
subexpr->getType()), Temp(temp), SubExpr(subexpr) { }
|
|
|
- ~CXXBindTemporaryExpr() { }
|
|
|
+ ~CXXBindTemporaryExpr() { }
|
|
|
|
|
|
protected:
|
|
|
virtual void DoDestroy(ASTContext &C);
|
|
|
|
|
|
public:
|
|
|
- static CXXBindTemporaryExpr *Create(ASTContext &C, CXXTemporary *Temp,
|
|
|
+ static CXXBindTemporaryExpr *Create(ASTContext &C, CXXTemporary *Temp,
|
|
|
Expr* SubExpr);
|
|
|
-
|
|
|
+
|
|
|
CXXTemporary *getTemporary() { return Temp; }
|
|
|
const CXXTemporary *getTemporary() const { return Temp; }
|
|
|
|
|
@@ -484,24 +484,24 @@ class CXXConstructExpr : public Expr {
|
|
|
CXXConstructorDecl *Constructor;
|
|
|
|
|
|
bool Elidable;
|
|
|
-
|
|
|
+
|
|
|
Stmt **Args;
|
|
|
unsigned NumArgs;
|
|
|
-
|
|
|
+
|
|
|
protected:
|
|
|
- CXXConstructExpr(ASTContext &C, StmtClass SC, QualType T,
|
|
|
+ CXXConstructExpr(ASTContext &C, StmtClass SC, QualType T,
|
|
|
CXXConstructorDecl *d, bool elidable,
|
|
|
Expr **args, unsigned numargs);
|
|
|
- ~CXXConstructExpr() { }
|
|
|
+ ~CXXConstructExpr() { }
|
|
|
|
|
|
virtual void DoDestroy(ASTContext &C);
|
|
|
|
|
|
public:
|
|
|
static CXXConstructExpr *Create(ASTContext &C, QualType T,
|
|
|
- CXXConstructorDecl *D, bool Elidable,
|
|
|
+ CXXConstructorDecl *D, bool Elidable,
|
|
|
Expr **Args, unsigned NumArgs);
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
CXXConstructorDecl* getConstructor() const { return Constructor; }
|
|
|
|
|
|
/// \brief Whether this construction is elidable.
|
|
@@ -509,7 +509,7 @@ public:
|
|
|
|
|
|
typedef ExprIterator arg_iterator;
|
|
|
typedef ConstExprIterator const_arg_iterator;
|
|
|
-
|
|
|
+
|
|
|
arg_iterator arg_begin() { return Args; }
|
|
|
arg_iterator arg_end() { return Args + NumArgs; }
|
|
|
const_arg_iterator arg_begin() const { return Args; }
|
|
@@ -526,7 +526,7 @@ public:
|
|
|
assert(Arg < NumArgs && "Arg access out of range!");
|
|
|
return cast<Expr>(Args[Arg]);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/// setArg - Set the specified argument.
|
|
|
void setArg(unsigned Arg, Expr *ArgExpr) {
|
|
|
assert(Arg < NumArgs && "Arg access out of range!");
|
|
@@ -535,12 +535,12 @@ public:
|
|
|
|
|
|
virtual SourceRange getSourceRange() const { return SourceRange(); }
|
|
|
|
|
|
- static bool classof(const Stmt *T) {
|
|
|
+ static bool classof(const Stmt *T) {
|
|
|
return T->getStmtClass() == CXXConstructExprClass ||
|
|
|
T->getStmtClass() == CXXTemporaryObjectExprClass;
|
|
|
}
|
|
|
static bool classof(const CXXConstructExpr *) { return true; }
|
|
|
-
|
|
|
+
|
|
|
// Iterators
|
|
|
virtual child_iterator child_begin();
|
|
|
virtual child_iterator child_end();
|
|
@@ -554,24 +554,24 @@ class CXXFunctionalCastExpr : public ExplicitCastExpr {
|
|
|
SourceLocation TyBeginLoc;
|
|
|
SourceLocation RParenLoc;
|
|
|
public:
|
|
|
- CXXFunctionalCastExpr(QualType ty, QualType writtenTy,
|
|
|
- SourceLocation tyBeginLoc, CastKind kind,
|
|
|
+ CXXFunctionalCastExpr(QualType ty, QualType writtenTy,
|
|
|
+ SourceLocation tyBeginLoc, CastKind kind,
|
|
|
Expr *castExpr, CXXMethodDecl *typeConversionMethod,
|
|
|
- SourceLocation rParenLoc) :
|
|
|
+ SourceLocation rParenLoc) :
|
|
|
ExplicitCastExpr(CXXFunctionalCastExprClass, ty, kind, castExpr, writtenTy),
|
|
|
TypeConversionMethod(typeConversionMethod),
|
|
|
TyBeginLoc(tyBeginLoc), RParenLoc(rParenLoc) {}
|
|
|
|
|
|
- CXXMethodDecl *getTypeConversionMethod() const
|
|
|
+ CXXMethodDecl *getTypeConversionMethod() const
|
|
|
{ return TypeConversionMethod; }
|
|
|
SourceLocation getTypeBeginLoc() const { return TyBeginLoc; }
|
|
|
SourceLocation getRParenLoc() const { return RParenLoc; }
|
|
|
-
|
|
|
+
|
|
|
virtual SourceRange getSourceRange() const {
|
|
|
return SourceRange(TyBeginLoc, RParenLoc);
|
|
|
}
|
|
|
- static bool classof(const Stmt *T) {
|
|
|
- return T->getStmtClass() == CXXFunctionalCastExprClass;
|
|
|
+ static bool classof(const Stmt *T) {
|
|
|
+ return T->getStmtClass() == CXXFunctionalCastExprClass;
|
|
|
}
|
|
|
static bool classof(const CXXFunctionalCastExpr *) { return true; }
|
|
|
};
|
|
@@ -579,7 +579,7 @@ public:
|
|
|
/// @brief Represents a C++ functional cast expression that builds a
|
|
|
/// temporary object.
|
|
|
///
|
|
|
-/// This expression type represents a C++ "functional" cast
|
|
|
+/// This expression type represents a C++ "functional" cast
|
|
|
/// (C++[expr.type.conv]) with N != 1 arguments that invokes a
|
|
|
/// constructor to build a temporary object. If N == 0 but no
|
|
|
/// constructor will be called (because the functional cast is
|
|
@@ -600,12 +600,12 @@ class CXXTemporaryObjectExpr : public CXXConstructExpr {
|
|
|
SourceLocation RParenLoc;
|
|
|
|
|
|
public:
|
|
|
- CXXTemporaryObjectExpr(ASTContext &C, CXXConstructorDecl *Cons,
|
|
|
- QualType writtenTy, SourceLocation tyBeginLoc,
|
|
|
- Expr **Args,unsigned NumArgs,
|
|
|
+ CXXTemporaryObjectExpr(ASTContext &C, CXXConstructorDecl *Cons,
|
|
|
+ QualType writtenTy, SourceLocation tyBeginLoc,
|
|
|
+ Expr **Args,unsigned NumArgs,
|
|
|
SourceLocation rParenLoc);
|
|
|
|
|
|
- ~CXXTemporaryObjectExpr() { }
|
|
|
+ ~CXXTemporaryObjectExpr() { }
|
|
|
|
|
|
SourceLocation getTypeBeginLoc() const { return TyBeginLoc; }
|
|
|
SourceLocation getRParenLoc() const { return RParenLoc; }
|
|
@@ -613,7 +613,7 @@ public:
|
|
|
virtual SourceRange getSourceRange() const {
|
|
|
return SourceRange(TyBeginLoc, RParenLoc);
|
|
|
}
|
|
|
- static bool classof(const Stmt *T) {
|
|
|
+ static bool classof(const Stmt *T) {
|
|
|
return T->getStmtClass() == CXXTemporaryObjectExprClass;
|
|
|
}
|
|
|
static bool classof(const CXXTemporaryObjectExpr *) { return true; }
|
|
@@ -630,28 +630,28 @@ class CXXZeroInitValueExpr : public Expr {
|
|
|
|
|
|
public:
|
|
|
CXXZeroInitValueExpr(QualType ty, SourceLocation tyBeginLoc,
|
|
|
- SourceLocation rParenLoc ) :
|
|
|
+ SourceLocation rParenLoc ) :
|
|
|
Expr(CXXZeroInitValueExprClass, ty, false, false),
|
|
|
TyBeginLoc(tyBeginLoc), RParenLoc(rParenLoc) {}
|
|
|
-
|
|
|
+
|
|
|
SourceLocation getTypeBeginLoc() const { return TyBeginLoc; }
|
|
|
SourceLocation getRParenLoc() const { return RParenLoc; }
|
|
|
|
|
|
/// @brief Whether this initialization expression was
|
|
|
/// implicitly-generated.
|
|
|
- bool isImplicit() const {
|
|
|
- return TyBeginLoc.isInvalid() && RParenLoc.isInvalid();
|
|
|
+ bool isImplicit() const {
|
|
|
+ return TyBeginLoc.isInvalid() && RParenLoc.isInvalid();
|
|
|
}
|
|
|
|
|
|
virtual SourceRange getSourceRange() const {
|
|
|
return SourceRange(TyBeginLoc, RParenLoc);
|
|
|
}
|
|
|
-
|
|
|
- static bool classof(const Stmt *T) {
|
|
|
+
|
|
|
+ static bool classof(const Stmt *T) {
|
|
|
return T->getStmtClass() == CXXZeroInitValueExprClass;
|
|
|
}
|
|
|
static bool classof(const CXXZeroInitValueExpr *) { return true; }
|
|
|
-
|
|
|
+
|
|
|
// Iterators
|
|
|
virtual child_iterator child_begin();
|
|
|
virtual child_iterator child_end();
|
|
@@ -666,26 +666,26 @@ class CXXConditionDeclExpr : public DeclRefExpr {
|
|
|
public:
|
|
|
CXXConditionDeclExpr(SourceLocation startLoc,
|
|
|
SourceLocation eqLoc, VarDecl *var)
|
|
|
- : DeclRefExpr(CXXConditionDeclExprClass, var,
|
|
|
+ : DeclRefExpr(CXXConditionDeclExprClass, var,
|
|
|
var->getType().getNonReferenceType(), startLoc,
|
|
|
var->getType()->isDependentType(),
|
|
|
/*FIXME:integral constant?*/
|
|
|
var->getType()->isDependentType()) {}
|
|
|
|
|
|
SourceLocation getStartLoc() const { return getLocation(); }
|
|
|
-
|
|
|
+
|
|
|
VarDecl *getVarDecl() { return cast<VarDecl>(getDecl()); }
|
|
|
const VarDecl *getVarDecl() const { return cast<VarDecl>(getDecl()); }
|
|
|
|
|
|
virtual SourceRange getSourceRange() const {
|
|
|
return SourceRange(getStartLoc(), getVarDecl()->getInit()->getLocEnd());
|
|
|
}
|
|
|
-
|
|
|
- static bool classof(const Stmt *T) {
|
|
|
+
|
|
|
+ static bool classof(const Stmt *T) {
|
|
|
return T->getStmtClass() == CXXConditionDeclExprClass;
|
|
|
}
|
|
|
static bool classof(const CXXConditionDeclExpr *) { return true; }
|
|
|
-
|
|
|
+
|
|
|
// Iterators
|
|
|
virtual child_iterator child_begin();
|
|
|
virtual child_iterator child_end();
|
|
@@ -866,7 +866,7 @@ public:
|
|
|
/// Example:
|
|
|
///
|
|
|
/// \code
|
|
|
-/// template<typename T>
|
|
|
+/// template<typename T>
|
|
|
/// void destroy(T* ptr) {
|
|
|
/// ptr->~T();
|
|
|
/// }
|
|
@@ -874,67 +874,67 @@ public:
|
|
|
///
|
|
|
/// When the template is parsed, the expression \c ptr->~T will be stored as
|
|
|
/// a member reference expression. If it then instantiated with a scalar type
|
|
|
-/// as a template argument for T, the resulting expression will be a
|
|
|
+/// as a template argument for T, the resulting expression will be a
|
|
|
/// pseudo-destructor expression.
|
|
|
class CXXPseudoDestructorExpr : public Expr {
|
|
|
/// \brief The base expression (that is being destroyed).
|
|
|
Stmt *Base;
|
|
|
-
|
|
|
+
|
|
|
/// \brief Whether the operator was an arrow ('->'); otherwise, it was a
|
|
|
/// period ('.').
|
|
|
bool IsArrow : 1;
|
|
|
-
|
|
|
+
|
|
|
/// \brief The location of the '.' or '->' operator.
|
|
|
SourceLocation OperatorLoc;
|
|
|
-
|
|
|
+
|
|
|
/// \brief The nested-name-specifier that follows the operator, if present.
|
|
|
NestedNameSpecifier *Qualifier;
|
|
|
-
|
|
|
- /// \brief The source range that covers the nested-name-specifier, if
|
|
|
+
|
|
|
+ /// \brief The source range that covers the nested-name-specifier, if
|
|
|
/// present.
|
|
|
SourceRange QualifierRange;
|
|
|
-
|
|
|
+
|
|
|
/// \brief The type being destroyed.
|
|
|
QualType DestroyedType;
|
|
|
-
|
|
|
+
|
|
|
/// \brief The location of the type after the '~'.
|
|
|
SourceLocation DestroyedTypeLoc;
|
|
|
-
|
|
|
+
|
|
|
public:
|
|
|
CXXPseudoDestructorExpr(ASTContext &Context,
|
|
|
Expr *Base, bool isArrow, SourceLocation OperatorLoc,
|
|
|
NestedNameSpecifier *Qualifier,
|
|
|
SourceRange QualifierRange,
|
|
|
- QualType DestroyedType,
|
|
|
+ QualType DestroyedType,
|
|
|
SourceLocation DestroyedTypeLoc)
|
|
|
- : Expr(CXXPseudoDestructorExprClass,
|
|
|
+ : Expr(CXXPseudoDestructorExprClass,
|
|
|
Context.getPointerType(Context.getFunctionType(Context.VoidTy, 0, 0,
|
|
|
false, 0)),
|
|
|
/*isTypeDependent=*/false,
|
|
|
/*isValueDependent=*/Base->isValueDependent()),
|
|
|
- Base(static_cast<Stmt *>(Base)), IsArrow(isArrow),
|
|
|
+ Base(static_cast<Stmt *>(Base)), IsArrow(isArrow),
|
|
|
OperatorLoc(OperatorLoc), Qualifier(Qualifier),
|
|
|
QualifierRange(QualifierRange), DestroyedType(DestroyedType),
|
|
|
DestroyedTypeLoc(DestroyedTypeLoc) { }
|
|
|
-
|
|
|
+
|
|
|
void setBase(Expr *E) { Base = E; }
|
|
|
Expr *getBase() const { return cast<Expr>(Base); }
|
|
|
-
|
|
|
- /// \brief Determines whether this member expression actually had
|
|
|
+
|
|
|
+ /// \brief Determines whether this member expression actually had
|
|
|
/// a C++ nested-name-specifier prior to the name of the member, e.g.,
|
|
|
/// x->Base::foo.
|
|
|
bool hasQualifier() const { return Qualifier != 0; }
|
|
|
-
|
|
|
+
|
|
|
/// \brief If the member name was qualified, retrieves the source range of
|
|
|
/// the nested-name-specifier that precedes the member name. Otherwise,
|
|
|
/// returns an empty source range.
|
|
|
SourceRange getQualifierRange() const { return QualifierRange; }
|
|
|
-
|
|
|
- /// \brief If the member name was qualified, retrieves the
|
|
|
+
|
|
|
+ /// \brief If the member name was qualified, retrieves the
|
|
|
/// nested-name-specifier that precedes the member name. Otherwise, returns
|
|
|
/// NULL.
|
|
|
NestedNameSpecifier *getQualifier() const { return Qualifier; }
|
|
|
-
|
|
|
+
|
|
|
/// \brief Determine whether this pseudo-destructor expression was written
|
|
|
/// using an '->' (otherwise, it used a '.').
|
|
|
bool isArrow() const { return IsArrow; }
|
|
@@ -942,27 +942,27 @@ public:
|
|
|
|
|
|
/// \brief Retrieve the location of the '.' or '->' operator.
|
|
|
SourceLocation getOperatorLoc() const { return OperatorLoc; }
|
|
|
-
|
|
|
+
|
|
|
/// \brief Retrieve the type that is being destroyed.
|
|
|
QualType getDestroyedType() const { return DestroyedType; }
|
|
|
-
|
|
|
+
|
|
|
/// \brief Retrieve the location of the type being destroyed.
|
|
|
SourceLocation getDestroyedTypeLoc() const { return DestroyedTypeLoc; }
|
|
|
-
|
|
|
+
|
|
|
virtual SourceRange getSourceRange() const {
|
|
|
return SourceRange(Base->getLocStart(), DestroyedTypeLoc);
|
|
|
}
|
|
|
-
|
|
|
- static bool classof(const Stmt *T) {
|
|
|
+
|
|
|
+ static bool classof(const Stmt *T) {
|
|
|
return T->getStmtClass() == CXXPseudoDestructorExprClass;
|
|
|
}
|
|
|
static bool classof(const CXXPseudoDestructorExpr *) { return true; }
|
|
|
-
|
|
|
+
|
|
|
// Iterators
|
|
|
virtual child_iterator child_begin();
|
|
|
- virtual child_iterator child_end();
|
|
|
+ virtual child_iterator child_end();
|
|
|
};
|
|
|
-
|
|
|
+
|
|
|
/// \brief Represents the name of a function that has not been
|
|
|
/// resolved to any declaration.
|
|
|
///
|
|
@@ -980,7 +980,7 @@ public:
|
|
|
/// }
|
|
|
/// @endcode
|
|
|
class UnresolvedFunctionNameExpr : public Expr {
|
|
|
- /// The name that was present in the source
|
|
|
+ /// The name that was present in the source
|
|
|
DeclarationName Name;
|
|
|
|
|
|
/// The location of this name in the source code
|
|
@@ -999,7 +999,7 @@ public:
|
|
|
|
|
|
virtual SourceRange getSourceRange() const { return SourceRange(Loc); }
|
|
|
|
|
|
- static bool classof(const Stmt *T) {
|
|
|
+ static bool classof(const Stmt *T) {
|
|
|
return T->getStmtClass() == UnresolvedFunctionNameExprClass;
|
|
|
}
|
|
|
static bool classof(const UnresolvedFunctionNameExpr *) { return true; }
|
|
@@ -1064,9 +1064,9 @@ class QualifiedDeclRefExpr : public DeclRefExpr {
|
|
|
NestedNameSpecifier *NNS;
|
|
|
|
|
|
public:
|
|
|
- QualifiedDeclRefExpr(NamedDecl *d, QualType t, SourceLocation l, bool TD,
|
|
|
+ QualifiedDeclRefExpr(NamedDecl *d, QualType t, SourceLocation l, bool TD,
|
|
|
bool VD, SourceRange R, NestedNameSpecifier *NNS)
|
|
|
- : DeclRefExpr(QualifiedDeclRefExprClass, d, t, l, TD, VD),
|
|
|
+ : DeclRefExpr(QualifiedDeclRefExprClass, d, t, l, TD, VD),
|
|
|
QualifierRange(R), NNS(NNS) { }
|
|
|
|
|
|
/// \brief Retrieve the source range of the nested-name-specifier.
|
|
@@ -1076,8 +1076,8 @@ public:
|
|
|
/// declaration.
|
|
|
NestedNameSpecifier *getQualifier() const { return NNS; }
|
|
|
|
|
|
- virtual SourceRange getSourceRange() const {
|
|
|
- return SourceRange(QualifierRange.getBegin(), getLocation());
|
|
|
+ virtual SourceRange getSourceRange() const {
|
|
|
+ return SourceRange(QualifierRange.getBegin(), getLocation());
|
|
|
}
|
|
|
|
|
|
static bool classof(const Stmt *T) {
|
|
@@ -1117,13 +1117,13 @@ class UnresolvedDeclRefExpr : public Expr {
|
|
|
|
|
|
/// \brief Whether this expr is an address of (&) operand.
|
|
|
bool IsAddressOfOperand;
|
|
|
-
|
|
|
+
|
|
|
public:
|
|
|
UnresolvedDeclRefExpr(DeclarationName N, QualType T, SourceLocation L,
|
|
|
- SourceRange R, NestedNameSpecifier *NNS,
|
|
|
+ SourceRange R, NestedNameSpecifier *NNS,
|
|
|
bool IsAddressOfOperand)
|
|
|
- : Expr(UnresolvedDeclRefExprClass, T, true, true),
|
|
|
- Name(N), Loc(L), QualifierRange(R), NNS(NNS),
|
|
|
+ : Expr(UnresolvedDeclRefExprClass, T, true, true),
|
|
|
+ Name(N), Loc(L), QualifierRange(R), NNS(NNS),
|
|
|
IsAddressOfOperand(IsAddressOfOperand) { }
|
|
|
|
|
|
/// \brief Retrieve the name that this expression refers to.
|
|
@@ -1140,10 +1140,10 @@ public:
|
|
|
NestedNameSpecifier *getQualifier() const { return NNS; }
|
|
|
|
|
|
/// \brief Retrieve whether this is an address of (&) operand.
|
|
|
-
|
|
|
+
|
|
|
bool isAddressOfOperand() const { return IsAddressOfOperand; }
|
|
|
- virtual SourceRange getSourceRange() const {
|
|
|
- return SourceRange(QualifierRange.getBegin(), getLocation());
|
|
|
+ virtual SourceRange getSourceRange() const {
|
|
|
+ return SourceRange(QualifierRange.getBegin(), getLocation());
|
|
|
}
|
|
|
|
|
|
static bool classof(const Stmt *T) {
|
|
@@ -1155,42 +1155,42 @@ public:
|
|
|
virtual StmtIterator child_end();
|
|
|
};
|
|
|
|
|
|
-/// \brief An expression that refers to a C++ template-id, such as
|
|
|
-/// @c isa<FunctionDecl>.
|
|
|
+/// \brief An expression that refers to a C++ template-id, such as
|
|
|
+/// @c isa<FunctionDecl>.
|
|
|
class TemplateIdRefExpr : public Expr {
|
|
|
/// \brief If this template-id was qualified-id, e.g., @c std::sort<int>,
|
|
|
/// this nested name specifier contains the @c std::.
|
|
|
NestedNameSpecifier *Qualifier;
|
|
|
-
|
|
|
+
|
|
|
/// \brief If this template-id was a qualified-id, e.g., @c std::sort<int>,
|
|
|
/// this covers the source code range of the @c std::.
|
|
|
SourceRange QualifierRange;
|
|
|
-
|
|
|
+
|
|
|
/// \brief The actual template to which this template-id refers.
|
|
|
TemplateName Template;
|
|
|
-
|
|
|
+
|
|
|
/// \brief The source location of the template name.
|
|
|
SourceLocation TemplateNameLoc;
|
|
|
|
|
|
/// \brief The source location of the left angle bracket ('<');
|
|
|
SourceLocation LAngleLoc;
|
|
|
-
|
|
|
+
|
|
|
/// \brief The source location of the right angle bracket ('>');
|
|
|
SourceLocation RAngleLoc;
|
|
|
-
|
|
|
+
|
|
|
/// \brief The number of template arguments in TemplateArgs.
|
|
|
unsigned NumTemplateArgs;
|
|
|
-
|
|
|
+
|
|
|
TemplateIdRefExpr(QualType T,
|
|
|
NestedNameSpecifier *Qualifier, SourceRange QualifierRange,
|
|
|
TemplateName Template, SourceLocation TemplateNameLoc,
|
|
|
- SourceLocation LAngleLoc,
|
|
|
+ SourceLocation LAngleLoc,
|
|
|
const TemplateArgument *TemplateArgs,
|
|
|
unsigned NumTemplateArgs,
|
|
|
SourceLocation RAngleLoc);
|
|
|
-
|
|
|
+
|
|
|
virtual void DoDestroy(ASTContext &Context);
|
|
|
-
|
|
|
+
|
|
|
public:
|
|
|
static TemplateIdRefExpr *
|
|
|
Create(ASTContext &Context, QualType T,
|
|
@@ -1198,66 +1198,66 @@ public:
|
|
|
TemplateName Template, SourceLocation TemplateNameLoc,
|
|
|
SourceLocation LAngleLoc, const TemplateArgument *TemplateArgs,
|
|
|
unsigned NumTemplateArgs, SourceLocation RAngleLoc);
|
|
|
-
|
|
|
+
|
|
|
/// \brief Retrieve the nested name specifier used to qualify the name of
|
|
|
/// this template-id, e.g., the "std::sort" in @c std::sort<int>, or NULL
|
|
|
/// if this template-id was an unqualified-id.
|
|
|
NestedNameSpecifier *getQualifier() const { return Qualifier; }
|
|
|
-
|
|
|
+
|
|
|
/// \brief Retrieve the source range describing the nested name specifier
|
|
|
/// used to qualified the name of this template-id, if the name was qualified.
|
|
|
SourceRange getQualifierRange() const { return QualifierRange; }
|
|
|
-
|
|
|
+
|
|
|
/// \brief Retrieve the name of the template referenced, e.g., "sort" in
|
|
|
/// @c std::sort<int>;
|
|
|
TemplateName getTemplateName() const { return Template; }
|
|
|
-
|
|
|
+
|
|
|
/// \brief Retrieve the location of the name of the template referenced, e.g.,
|
|
|
/// the location of "sort" in @c std::sort<int>.
|
|
|
SourceLocation getTemplateNameLoc() const { return TemplateNameLoc; }
|
|
|
-
|
|
|
- /// \brief Retrieve the location of the left angle bracket following the
|
|
|
+
|
|
|
+ /// \brief Retrieve the location of the left angle bracket following the
|
|
|
/// template name ('<').
|
|
|
SourceLocation getLAngleLoc() const { return LAngleLoc; }
|
|
|
-
|
|
|
+
|
|
|
/// \brief Retrieve the template arguments provided as part of this
|
|
|
/// template-id.
|
|
|
- const TemplateArgument *getTemplateArgs() const {
|
|
|
+ const TemplateArgument *getTemplateArgs() const {
|
|
|
return reinterpret_cast<const TemplateArgument *>(this + 1);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/// \brief Retrieve the number of template arguments provided as part of this
|
|
|
/// template-id.
|
|
|
unsigned getNumTemplateArgs() const { return NumTemplateArgs; }
|
|
|
-
|
|
|
- /// \brief Retrieve the location of the right angle bracket following the
|
|
|
+
|
|
|
+ /// \brief Retrieve the location of the right angle bracket following the
|
|
|
/// template arguments ('>').
|
|
|
SourceLocation getRAngleLoc() const { return RAngleLoc; }
|
|
|
-
|
|
|
+
|
|
|
virtual SourceRange getSourceRange() const {
|
|
|
return SourceRange(Qualifier? QualifierRange.getBegin() : TemplateNameLoc,
|
|
|
RAngleLoc);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
// Iterators
|
|
|
virtual child_iterator child_begin();
|
|
|
virtual child_iterator child_end();
|
|
|
-
|
|
|
- static bool classof(const Stmt *T) {
|
|
|
+
|
|
|
+ static bool classof(const Stmt *T) {
|
|
|
return T->getStmtClass() == TemplateIdRefExprClass;
|
|
|
}
|
|
|
static bool classof(const TemplateIdRefExpr *) { return true; }
|
|
|
};
|
|
|
-
|
|
|
+
|
|
|
class CXXExprWithTemporaries : public Expr {
|
|
|
Stmt *SubExpr;
|
|
|
-
|
|
|
+
|
|
|
CXXTemporary **Temps;
|
|
|
unsigned NumTemps;
|
|
|
|
|
|
bool ShouldDestroyTemps;
|
|
|
-
|
|
|
- CXXExprWithTemporaries(Expr *SubExpr, CXXTemporary **Temps,
|
|
|
+
|
|
|
+ CXXExprWithTemporaries(Expr *SubExpr, CXXTemporary **Temps,
|
|
|
unsigned NumTemps, bool ShouldDestroyTemps);
|
|
|
~CXXExprWithTemporaries();
|
|
|
|
|
@@ -1268,7 +1268,7 @@ public:
|
|
|
static CXXExprWithTemporaries *Create(ASTContext &C, Expr *SubExpr,
|
|
|
CXXTemporary **Temps, unsigned NumTemps,
|
|
|
bool ShouldDestroyTemporaries);
|
|
|
-
|
|
|
+
|
|
|
unsigned getNumTemporaries() const { return NumTemps; }
|
|
|
CXXTemporary *getTemporary(unsigned i) {
|
|
|
assert(i < NumTemps && "Index out of range");
|
|
@@ -1278,11 +1278,11 @@ public:
|
|
|
assert(i < NumTemps && "Index out of range");
|
|
|
return Temps[i];
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
bool shouldDestroyTemporaries() const { return ShouldDestroyTemps; }
|
|
|
-
|
|
|
+
|
|
|
void removeLastTemporary() { NumTemps--; }
|
|
|
-
|
|
|
+
|
|
|
Expr *getSubExpr() { return cast<Expr>(SubExpr); }
|
|
|
const Expr *getSubExpr() const { return cast<Expr>(SubExpr); }
|
|
|
void setSubExpr(Expr *E) { SubExpr = E; }
|
|
@@ -1336,7 +1336,7 @@ class CXXUnresolvedConstructExpr : public Expr {
|
|
|
|
|
|
/// \brief The number of arguments used to construct the type.
|
|
|
unsigned NumArgs;
|
|
|
-
|
|
|
+
|
|
|
CXXUnresolvedConstructExpr(SourceLocation TyBegin,
|
|
|
QualType T,
|
|
|
SourceLocation LParenLoc,
|
|
@@ -1345,7 +1345,7 @@ class CXXUnresolvedConstructExpr : public Expr {
|
|
|
SourceLocation RParenLoc);
|
|
|
|
|
|
public:
|
|
|
- static CXXUnresolvedConstructExpr *Create(ASTContext &C,
|
|
|
+ static CXXUnresolvedConstructExpr *Create(ASTContext &C,
|
|
|
SourceLocation TyBegin,
|
|
|
QualType T,
|
|
|
SourceLocation LParenLoc,
|
|
@@ -1387,7 +1387,7 @@ public:
|
|
|
virtual SourceRange getSourceRange() const {
|
|
|
return SourceRange(TyBeginLoc, RParenLoc);
|
|
|
}
|
|
|
- static bool classof(const Stmt *T) {
|
|
|
+ static bool classof(const Stmt *T) {
|
|
|
return T->getStmtClass() == CXXUnresolvedConstructExprClass;
|
|
|
}
|
|
|
static bool classof(const CXXUnresolvedConstructExpr *) { return true; }
|
|
@@ -1404,7 +1404,7 @@ class CXXUnresolvedMemberExpr : public Expr {
|
|
|
/// \brief The expression for the base pointer or class reference,
|
|
|
/// e.g., the \c x in x.f.
|
|
|
Stmt *Base;
|
|
|
-
|
|
|
+
|
|
|
/// \brief Whether this member expression used the '->' operator or
|
|
|
/// the '.' operator.
|
|
|
bool IsArrow : 1;
|
|
@@ -1412,25 +1412,25 @@ class CXXUnresolvedMemberExpr : public Expr {
|
|
|
/// \brief Whether this member expression has explicitly-specified template
|
|
|
/// arguments.
|
|
|
bool HasExplicitTemplateArgumentList : 1;
|
|
|
-
|
|
|
+
|
|
|
/// \brief The location of the '->' or '.' operator.
|
|
|
SourceLocation OperatorLoc;
|
|
|
|
|
|
/// \brief The nested-name-specifier that precedes the member name, if any.
|
|
|
NestedNameSpecifier *Qualifier;
|
|
|
-
|
|
|
+
|
|
|
/// \brief The source range covering the nested name specifier.
|
|
|
SourceRange QualifierRange;
|
|
|
-
|
|
|
+
|
|
|
/// \brief In a qualified member access expression such as t->Base::f, this
|
|
|
- /// member stores the resolves of name lookup in the context of the member
|
|
|
+ /// member stores the resolves of name lookup in the context of the member
|
|
|
/// access expression, to be used at instantiation time.
|
|
|
///
|
|
|
/// FIXME: This member, along with the Qualifier and QualifierRange, could
|
|
|
/// be stuck into a structure that is optionally allocated at the end of
|
|
|
/// the CXXUnresolvedMemberExpr, to save space in the common case.
|
|
|
NamedDecl *FirstQualifierFoundInScope;
|
|
|
-
|
|
|
+
|
|
|
/// \brief The member to which this member expression refers, which
|
|
|
/// can be name, overloaded operator, or destructor.
|
|
|
/// FIXME: could also be a template-id
|
|
@@ -1438,25 +1438,25 @@ class CXXUnresolvedMemberExpr : public Expr {
|
|
|
|
|
|
/// \brief The location of the member name.
|
|
|
SourceLocation MemberLoc;
|
|
|
-
|
|
|
+
|
|
|
/// \brief Retrieve the explicit template argument list that followed the
|
|
|
/// member template name, if any.
|
|
|
ExplicitTemplateArgumentList *getExplicitTemplateArgumentList() {
|
|
|
if (!HasExplicitTemplateArgumentList)
|
|
|
return 0;
|
|
|
-
|
|
|
+
|
|
|
return reinterpret_cast<ExplicitTemplateArgumentList *>(this + 1);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/// \brief Retrieve the explicit template argument list that followed the
|
|
|
/// member template name, if any.
|
|
|
const ExplicitTemplateArgumentList *getExplicitTemplateArgumentList() const {
|
|
|
return const_cast<CXXUnresolvedMemberExpr *>(this)
|
|
|
->getExplicitTemplateArgumentList();
|
|
|
}
|
|
|
-
|
|
|
- CXXUnresolvedMemberExpr(ASTContext &C,
|
|
|
- Expr *Base, bool IsArrow,
|
|
|
+
|
|
|
+ CXXUnresolvedMemberExpr(ASTContext &C,
|
|
|
+ Expr *Base, bool IsArrow,
|
|
|
SourceLocation OperatorLoc,
|
|
|
NestedNameSpecifier *Qualifier,
|
|
|
SourceRange QualifierRange,
|
|
@@ -1468,10 +1468,10 @@ class CXXUnresolvedMemberExpr : public Expr {
|
|
|
const TemplateArgument *TemplateArgs,
|
|
|
unsigned NumTemplateArgs,
|
|
|
SourceLocation RAngleLoc);
|
|
|
-
|
|
|
+
|
|
|
public:
|
|
|
- CXXUnresolvedMemberExpr(ASTContext &C,
|
|
|
- Expr *Base, bool IsArrow,
|
|
|
+ CXXUnresolvedMemberExpr(ASTContext &C,
|
|
|
+ Expr *Base, bool IsArrow,
|
|
|
SourceLocation OperatorLoc,
|
|
|
NestedNameSpecifier *Qualifier,
|
|
|
SourceRange QualifierRange,
|
|
@@ -1484,10 +1484,10 @@ public:
|
|
|
Qualifier(Qualifier), QualifierRange(QualifierRange),
|
|
|
FirstQualifierFoundInScope(FirstQualifierFoundInScope),
|
|
|
Member(Member), MemberLoc(MemberLoc) { }
|
|
|
-
|
|
|
+
|
|
|
static CXXUnresolvedMemberExpr *
|
|
|
- Create(ASTContext &C,
|
|
|
- Expr *Base, bool IsArrow,
|
|
|
+ Create(ASTContext &C,
|
|
|
+ Expr *Base, bool IsArrow,
|
|
|
SourceLocation OperatorLoc,
|
|
|
NestedNameSpecifier *Qualifier,
|
|
|
SourceRange QualifierRange,
|
|
@@ -1499,7 +1499,7 @@ public:
|
|
|
const TemplateArgument *TemplateArgs,
|
|
|
unsigned NumTemplateArgs,
|
|
|
SourceLocation RAngleLoc);
|
|
|
-
|
|
|
+
|
|
|
/// \brief Retrieve the base object of this member expressions,
|
|
|
/// e.g., the \c x in \c x.m.
|
|
|
Expr *getBase() { return cast<Expr>(Base); }
|
|
@@ -1517,26 +1517,26 @@ public:
|
|
|
/// \brief Retrieve the nested-name-specifier that qualifies the member
|
|
|
/// name.
|
|
|
NestedNameSpecifier *getQualifier() const { return Qualifier; }
|
|
|
-
|
|
|
+
|
|
|
/// \brief Retrieve the source range covering the nested-name-specifier
|
|
|
/// that qualifies the member name.
|
|
|
SourceRange getQualifierRange() const { return QualifierRange; }
|
|
|
-
|
|
|
+
|
|
|
/// \brief Retrieve the first part of the nested-name-specifier that was
|
|
|
/// found in the scope of the member access expression when the member access
|
|
|
/// was initially parsed.
|
|
|
///
|
|
|
/// This function only returns a useful result when member access expression
|
|
|
- /// uses a qualified member name, e.g., "x.Base::f". Here, the declaration
|
|
|
- /// returned by this function describes what was found by unqualified name
|
|
|
+ /// uses a qualified member name, e.g., "x.Base::f". Here, the declaration
|
|
|
+ /// returned by this function describes what was found by unqualified name
|
|
|
/// lookup for the identifier "Base" within the scope of the member access
|
|
|
/// expression itself. At template instantiation time, this information is
|
|
|
/// combined with the results of name lookup into the type of the object
|
|
|
/// expression itself (the class type of x).
|
|
|
- NamedDecl *getFirstQualifierFoundInScope() const {
|
|
|
+ NamedDecl *getFirstQualifierFoundInScope() const {
|
|
|
return FirstQualifierFoundInScope;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/// \brief Retrieve the name of the member that this expression
|
|
|
/// refers to.
|
|
|
DeclarationName getMember() const { return Member; }
|
|
@@ -1549,56 +1549,56 @@ public:
|
|
|
|
|
|
/// \brief Determines whether this member expression actually had a C++
|
|
|
/// template argument list explicitly specified, e.g., x.f<int>.
|
|
|
- bool hasExplicitTemplateArgumentList() {
|
|
|
- return HasExplicitTemplateArgumentList;
|
|
|
+ bool hasExplicitTemplateArgumentList() {
|
|
|
+ return HasExplicitTemplateArgumentList;
|
|
|
}
|
|
|
-
|
|
|
- /// \brief Retrieve the location of the left angle bracket following the
|
|
|
+
|
|
|
+ /// \brief Retrieve the location of the left angle bracket following the
|
|
|
/// member name ('<'), if any.
|
|
|
- SourceLocation getLAngleLoc() const {
|
|
|
+ SourceLocation getLAngleLoc() const {
|
|
|
if (!HasExplicitTemplateArgumentList)
|
|
|
return SourceLocation();
|
|
|
-
|
|
|
+
|
|
|
return getExplicitTemplateArgumentList()->LAngleLoc;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/// \brief Retrieve the template arguments provided as part of this
|
|
|
/// template-id.
|
|
|
- const TemplateArgument *getTemplateArgs() const {
|
|
|
+ const TemplateArgument *getTemplateArgs() const {
|
|
|
if (!HasExplicitTemplateArgumentList)
|
|
|
- return 0;
|
|
|
-
|
|
|
+ return 0;
|
|
|
+
|
|
|
return getExplicitTemplateArgumentList()->getTemplateArgs();
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/// \brief Retrieve the number of template arguments provided as part of this
|
|
|
/// template-id.
|
|
|
- unsigned getNumTemplateArgs() const {
|
|
|
+ unsigned getNumTemplateArgs() const {
|
|
|
if (!HasExplicitTemplateArgumentList)
|
|
|
- return 0;
|
|
|
-
|
|
|
+ return 0;
|
|
|
+
|
|
|
return getExplicitTemplateArgumentList()->NumTemplateArgs;
|
|
|
}
|
|
|
-
|
|
|
- /// \brief Retrieve the location of the right angle bracket following the
|
|
|
+
|
|
|
+ /// \brief Retrieve the location of the right angle bracket following the
|
|
|
/// template arguments ('>').
|
|
|
- SourceLocation getRAngleLoc() const {
|
|
|
+ SourceLocation getRAngleLoc() const {
|
|
|
if (!HasExplicitTemplateArgumentList)
|
|
|
return SourceLocation();
|
|
|
-
|
|
|
+
|
|
|
return getExplicitTemplateArgumentList()->RAngleLoc;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
virtual SourceRange getSourceRange() const {
|
|
|
if (HasExplicitTemplateArgumentList)
|
|
|
return SourceRange(Base->getSourceRange().getBegin(),
|
|
|
getRAngleLoc());
|
|
|
-
|
|
|
+
|
|
|
return SourceRange(Base->getSourceRange().getBegin(),
|
|
|
MemberLoc);
|
|
|
}
|
|
|
-
|
|
|
- static bool classof(const Stmt *T) {
|
|
|
+
|
|
|
+ static bool classof(const Stmt *T) {
|
|
|
return T->getStmtClass() == CXXUnresolvedMemberExprClass;
|
|
|
}
|
|
|
static bool classof(const CXXUnresolvedMemberExpr *) { return true; }
|