From: Steve Naroff Date: Sat, 25 Aug 2007 14:37:06 +0000 (+0000) Subject: Change Expr::isLvalue() to properly deal with ImplicitCastExpr's. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ad7ef480b93a0d5dd23ec2202662b99465fcfa7e;p=clang Change Expr::isLvalue() to properly deal with ImplicitCastExpr's. This fixes the following bug... t.c:1:31: error: expression is not assignable short x; void foo(char c) { x += c; } This case, among others are now captured in implicit-casts.c. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41402 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/AST/Expr.cpp b/AST/Expr.cpp index 535e1ef786..5167d4e109 100644 --- a/AST/Expr.cpp +++ b/AST/Expr.cpp @@ -302,6 +302,8 @@ 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/test/Parser/implicit-casts.c b/test/Parser/implicit-casts.c new file mode 100644 index 0000000000..4ba56e4191 --- /dev/null +++ b/test/Parser/implicit-casts.c @@ -0,0 +1,20 @@ +// RUN: clang -parse-ast-check %s +_Complex double X; +void test1(int c) { + X = 5; +} +void test2() { + int i; + double d = i; + double _Complex a = 5; + + test1(a); + a = 5; + d = i; +} +int test3() { + int a[2]; + a[0] = test3; // expected-warning{{incompatible types assigning 'int (void)' to 'int'}} +} +short x; void test4(char c) { x += c; } +int y; void test5(char c) { y += c; }