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 88a0579..af0e6d4 100644
--- a/Sema/SemaExpr.cpp
+++ b/Sema/SemaExpr.cpp
@@ -1561,9 +1561,9 @@
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 8a4f6af..138db62 100644
--- a/include/clang/AST/Expr.h
+++ b/include/clang/AST/Expr.h
@@ -722,15 +722,23 @@
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 @@
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 @@
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");
}