From: Chris Lattner Date: Tue, 28 Aug 2007 18:36:55 +0000 (+0000) Subject: add a sourcelocation to binary operator to keep track of the location of the operator. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=17d1b2ac9f8371a0a2e79d4f8e0008658164f080;p=clang add a sourcelocation to binary operator to keep track of the location of the operator. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41550 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Sema/SemaExpr.cpp b/Sema/SemaExpr.cpp index 88a057930b..af0e6d4e8e 100644 --- a/Sema/SemaExpr.cpp +++ b/Sema/SemaExpr.cpp @@ -1561,9 +1561,9 @@ Action::ExprResult Sema::ParseBinOp(SourceLocation TokLoc, tok::TokenKind Kind, if (ResultTy.isNull()) return true; if (CompTy.isNull()) - return new BinaryOperator(lhs, rhs, Opc, ResultTy); + return new BinaryOperator(lhs, rhs, Opc, ResultTy, TokLoc); else - return new CompoundAssignOperator(lhs, rhs, Opc, ResultTy, CompTy); + return new CompoundAssignOperator(lhs, rhs, Opc, ResultTy, CompTy, TokLoc); } // Unary Operators. 'Tok' is the token for the operator. diff --git a/include/clang/AST/Expr.h b/include/clang/AST/Expr.h index 8a4f6affbb..138db62cf9 100644 --- a/include/clang/AST/Expr.h +++ b/include/clang/AST/Expr.h @@ -722,15 +722,23 @@ public: OrAssign, Comma // [C99 6.5.17] Comma operator. }; +private: + enum { LHS, RHS, END_EXPR }; + Expr* SubExprs[END_EXPR]; + Opcode Opc; + SourceLocation OpLoc; +public: - BinaryOperator(Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy) - : Expr(BinaryOperatorClass, ResTy), Opc(opc) { + BinaryOperator(Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, + SourceLocation opLoc) + : Expr(BinaryOperatorClass, ResTy), Opc(opc), OpLoc(opLoc) { SubExprs[LHS] = lhs; SubExprs[RHS] = rhs; assert(!isCompoundAssignmentOp() && "Use ArithAssignBinaryOperator for compound assignments"); } + SourceLocation getOperatorLoc() const { return OpLoc; } Opcode getOpcode() const { return Opc; } Expr *getLHS() const { return SubExprs[LHS]; } Expr *getRHS() const { return SubExprs[RHS]; } @@ -764,14 +772,10 @@ public: virtual child_iterator child_begin(); virtual child_iterator child_end(); -private: - enum { LHS, RHS, END_EXPR }; - Expr* SubExprs[END_EXPR]; - Opcode Opc; - protected: - BinaryOperator(Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, bool dead) - : Expr(CompoundAssignOperatorClass, ResTy), Opc(opc) { + BinaryOperator(Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, + SourceLocation oploc, bool dead) + : Expr(CompoundAssignOperatorClass, ResTy), Opc(opc), OpLoc(oploc) { SubExprs[LHS] = lhs; SubExprs[RHS] = rhs; } @@ -787,8 +791,10 @@ class CompoundAssignOperator : public BinaryOperator { QualType ComputationType; public: CompoundAssignOperator(Expr *lhs, Expr *rhs, Opcode opc, - QualType ResType, QualType CompType) - : BinaryOperator(lhs, rhs, opc, ResType, true), ComputationType(CompType) { + QualType ResType, QualType CompType, + SourceLocation OpLoc) + : BinaryOperator(lhs, rhs, opc, ResType, OpLoc, true), + ComputationType(CompType) { assert(isCompoundAssignmentOp() && "Only should be used for compound assignments"); }