diff options
-rw-r--r-- | Sema/SemaExpr.cpp | 13 | ||||
-rw-r--r-- | test/Sema/assign.c | 8 |
2 files changed, 19 insertions, 2 deletions
diff --git a/Sema/SemaExpr.cpp b/Sema/SemaExpr.cpp index 9bd6c7e44c..179117e96e 100644 --- a/Sema/SemaExpr.cpp +++ b/Sema/SemaExpr.cpp @@ -904,8 +904,17 @@ void Sema::DefaultFunctionArrayConversion(Expr *&e) { } if (t->isFunctionType()) ImpCastExprToType(e, Context.getPointerType(t)); - else if (const ArrayType *ary = t->getAsArrayType()) - ImpCastExprToType(e, Context.getPointerType(ary->getElementType())); + else if (const ArrayType *ary = t->getAsArrayType()) { + // Make sure we don't loose qualifiers when dealing with typedefs. Example: + // typedef int arr[10]; + // void test2() { + // const arr b; + // b[4] = 1; + // } + QualType ELT = ary->getElementType(); + ELT = ELT.getQualifiedType(t.getQualifiers()|ELT.getQualifiers()); + ImpCastExprToType(e, Context.getPointerType(ELT)); + } } /// UsualUnaryConversions - Performs various conversions that are common to most diff --git a/test/Sema/assign.c b/test/Sema/assign.c index b94d5835ee..4ddb25a94a 100644 --- a/test/Sema/assign.c +++ b/test/Sema/assign.c @@ -5,3 +5,11 @@ void *test1(void) { return 0; } void test2 (const struct {int a;} *x) { x->a = 10; // expected-error {{read-only variable is not assignable}} } + +typedef int arr[10]; +void test3() { + const arr b; + const int b2[10]; + b[4] = 1; // expected-error {{read-only variable is not assignable}} + b2[4] = 1; // expected-error {{read-only variable is not assignable}} +} |