From e2562ff99d15488c7c7184488d5e18a46e84f582 Mon Sep 17 00:00:00 2001 From: Steve Naroff Date: Sat, 25 Aug 2007 14:37:06 +0000 Subject: [PATCH] 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. llvm-svn: 41402 --- clang/AST/Expr.cpp | 2 ++ clang/test/Parser/implicit-casts.c | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 clang/test/Parser/implicit-casts.c diff --git a/clang/AST/Expr.cpp b/clang/AST/Expr.cpp index 535e1ef786f1..5167d4e109b3 100644 --- a/clang/AST/Expr.cpp +++ b/clang/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/clang/test/Parser/implicit-casts.c b/clang/test/Parser/implicit-casts.c new file mode 100644 index 000000000000..4ba56e419126 --- /dev/null +++ b/clang/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; }