diff options
author | Abramo Bagnara <abramo.bagnara@gmail.com> | 2010-09-13 06:50:07 +0000 |
---|---|---|
committer | Abramo Bagnara <abramo.bagnara@gmail.com> | 2010-09-13 06:50:07 +0000 |
commit | 3aabb4b452e563a382543f3d191ca3d1c036293e (patch) | |
tree | 5416c98e4c5f2c3b5f4d40ff8f3cb2a2571baee6 | |
parent | 6a0c4097f14234ec89546448a116486dc27bbb4b (diff) | |
download | bcm5719-llvm-3aabb4b452e563a382543f3d191ca3d1c036293e.tar.gz bcm5719-llvm-3aabb4b452e563a382543f3d191ca3d1c036293e.zip |
Congruent diagnostic for void* arithmetic.
llvm-svn: 113740
-rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 6 | ||||
-rw-r--r-- | clang/test/CodeGen/pointer-arithmetic.c | 3 | ||||
-rw-r--r-- | clang/test/Sema/pointer-addition.c | 1 |
3 files changed, 9 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 1152da9bdc0..9a394aeeb9a 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -2418,7 +2418,11 @@ Sema::CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc, return ExprError(); } - if (!ResultType->isDependentType() && + if (ResultType->isVoidType() && !getLangOptions().CPlusPlus) { + // GNU extension: subscripting on pointer to void + Diag(LLoc, diag::ext_gnu_void_ptr) + << BaseExpr->getSourceRange(); + } else if (!ResultType->isDependentType() && RequireCompleteType(LLoc, ResultType, PDiag(diag::err_subscript_incomplete_type) << BaseExpr->getSourceRange())) diff --git a/clang/test/CodeGen/pointer-arithmetic.c b/clang/test/CodeGen/pointer-arithmetic.c index 33465e0aa13..f67a36d66e4 100644 --- a/clang/test/CodeGen/pointer-arithmetic.c +++ b/clang/test/CodeGen/pointer-arithmetic.c @@ -9,6 +9,7 @@ int f1(const char *a, char *b) { return b - a; } // GNU extensions typedef void (*FP)(void); void *f2(void *a, int b) { return a + b; } +void *f2_0(void *a, int b) { return &a[b]; } void *f2_1(void *a, int b) { return (a += b); } void *f3(int a, void *b) { return a + b; } void *f3_1(int a, void *b) { return (a += b); } @@ -20,3 +21,5 @@ FP f6(int a, FP b) { return a + b; } FP f6_1(int a, FP b) { return (a += b); } FP f7(FP a, int b) { return a - b; } FP f7_1(FP a, int b) { return (a -= b); } +void f8(void *a, int b) { return *(a + b); } +void f8_1(void *a, int b) { return a[b]; } diff --git a/clang/test/Sema/pointer-addition.c b/clang/test/Sema/pointer-addition.c index 34f8bbbfcd6..aa425a7fd9d 100644 --- a/clang/test/Sema/pointer-addition.c +++ b/clang/test/Sema/pointer-addition.c @@ -9,6 +9,7 @@ void a(S* b, void* c) { c += 1; // expected-warning {{use of GNU void* extension}} c--; // expected-warning {{use of GNU void* extension}} c -= 1; // expected-warning {{use of GNU void* extension}} + (void) c[1]; // expected-warning {{use of GNU void* extension}} b = 1+b; // expected-error {{arithmetic on pointer to incomplete type}} /* The next couple tests are only pedantic warnings in gcc */ void (*d)(S*,void*) = a; |