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
This commit is contained in:
Steve Naroff 2007-08-25 14:37:06 +00:00
parent aac9415bfb
commit e2562ff99d
2 changed files with 22 additions and 0 deletions

View File

@ -302,6 +302,8 @@ Expr::isLvalueResult Expr::isLvalue() const {
if (cast<OCUVectorElementExpr>(this)->containsDuplicateElements())
return LV_DuplicateVectorComponents;
return LV_Valid;
case ImplicitCastExprClass: // A side-effect of our implementation.
return cast<ImplicitCastExpr>(this)->getSubExpr()->isLvalue();
default:
break;
}

View File

@ -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; }