summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAbramo Bagnara <abramo.bagnara@gmail.com>2010-09-13 06:50:07 +0000
committerAbramo Bagnara <abramo.bagnara@gmail.com>2010-09-13 06:50:07 +0000
commit3aabb4b452e563a382543f3d191ca3d1c036293e (patch)
tree5416c98e4c5f2c3b5f4d40ff8f3cb2a2571baee6
parent6a0c4097f14234ec89546448a116486dc27bbb4b (diff)
downloadbcm5719-llvm-3aabb4b452e563a382543f3d191ca3d1c036293e.tar.gz
bcm5719-llvm-3aabb4b452e563a382543f3d191ca3d1c036293e.zip
Congruent diagnostic for void* arithmetic.
llvm-svn: 113740
-rw-r--r--clang/lib/Sema/SemaExpr.cpp6
-rw-r--r--clang/test/CodeGen/pointer-arithmetic.c3
-rw-r--r--clang/test/Sema/pointer-addition.c1
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;
OpenPOWER on IntegriCloud