From 46c72915f43a5d10537ef5986444078664fb7265 Mon Sep 17 00:00:00 2001 From: Steve Naroff Date: Sat, 25 Aug 2007 19:54:59 +0000 Subject: [PATCH] Surpress the UsualUnaryConversions for compound assignment operators. This change eliminates the possibility that the left hand expression is an ImplicitCastExpr. As a result, I removed the check for ImplicitCastExpr in Expr::isLvalue(). This results in the following AST's... [dylan:~/llvm/tools/clang] admin% cat fix.c short x; void test4(char c) { x += c; x = x + c; } [dylan:~/llvm/tools/clang] admin% ../../Debug/bin/clang fix.c -parse-ast-dump Read top-level variable decl: 'x' void test4(char c) (CompoundStmt 0x2605d30 (CompoundAssignOperator 0x2605c40 'short' '+=' (DeclRefExpr 0x2605c00 'short' Decl='x' 0x2605a80) (DeclRefExpr 0x2605c20 'char' Decl='c' 0x2605bc0)) (BinaryOperator 0x2605d10 'short' '=' (DeclRefExpr 0x2605c60 'short' Decl='x' 0x2605a80) (ImplicitCastExpr 0x2605d00 'short' (BinaryOperator 0x2605ce0 'int' '+' (ImplicitCastExpr 0x2605cc0 'int' (DeclRefExpr 0x2605c80 'short' Decl='x' 0x2605a80)) (ImplicitCastExpr 0x2605cd0 'int' (DeclRefExpr 0x2605ca0 'char' Decl='c' 0x2605bc0)))))) llvm-svn: 41404 --- clang/AST/Expr.cpp | 2 -- clang/Sema/SemaExpr.cpp | 7 ++++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/clang/AST/Expr.cpp b/clang/AST/Expr.cpp index 5167d4e109b3..535e1ef786f1 100644 --- a/clang/AST/Expr.cpp +++ b/clang/AST/Expr.cpp @@ -302,8 +302,6 @@ Expr::isLvalueResult Expr::isLvalue() const { if (cast(this)->containsDuplicateElements()) return LV_DuplicateVectorComponents; return LV_Valid; - case ImplicitCastExprClass: // A side-effect of our implementation. - return cast(this)->getSubExpr()->isLvalue(); default: break; } diff --git a/clang/Sema/SemaExpr.cpp b/clang/Sema/SemaExpr.cpp index a86a25525646..7666ad0474d4 100644 --- a/clang/Sema/SemaExpr.cpp +++ b/clang/Sema/SemaExpr.cpp @@ -765,9 +765,10 @@ void Sema::UsualUnaryConversions(Expr *&expr) { /// responsible for emitting appropriate error diagnostics. QualType Sema::UsualArithmeticConversions(Expr *&lhsExpr, Expr *&rhsExpr, bool isCompAssign) { - UsualUnaryConversions(lhsExpr); - UsualUnaryConversions(rhsExpr); - + if (!isCompAssign) { + UsualUnaryConversions(lhsExpr); + UsualUnaryConversions(rhsExpr); + } QualType lhs = lhsExpr->getType(); QualType rhs = rhsExpr->getType();