From 336ed0b79b8abd0a25ac0083a2d43049e450dab0 Mon Sep 17 00:00:00 2001 From: Steve Naroff Date: Sat, 9 Feb 2008 16:59:44 +0000 Subject: [PATCH] Fix clang doesn't emit error for const array. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46905 91177308-0d34-0410-b5e6-96231b3b80d8 --- Sema/SemaExpr.cpp | 13 +++++++++++-- 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}} +}