[PATCH] D76086: [Sema][SVE] Reject arithmetic on pointers to sizeless types
Richard Sandiford via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Mar 12 11:56:27 PDT 2020
rsandifo-arm created this revision.
rsandifo-arm added reviewers: sdesmalen, efriedma, rovka, rjmccall.
Herald added subscribers: cfe-commits, psnobl, rkruppe, tschuett.
Herald added a project: clang.
rsandifo-arm added a parent revision: D76084: [Sema][SVE] Reject subscripts on pointers to sizeless types.
rsandifo-arm added a child revision: D76087: [Sema][SVE] Reject sizeless types in exception specs.
This patch completes a trio of changes related to arrays of
sizeless types. It rejects various forms of arithmetic on
pointers to sizeless types, in the same way as for other
incomplete types.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D76086
Files:
clang/include/clang/Basic/DiagnosticSemaKinds.td
clang/lib/Sema/SemaExpr.cpp
clang/test/Sema/sizeless-1.c
clang/test/SemaCXX/sizeless-1.cpp
Index: clang/test/SemaCXX/sizeless-1.cpp
===================================================================
--- clang/test/SemaCXX/sizeless-1.cpp
+++ clang/test/SemaCXX/sizeless-1.cpp
@@ -158,6 +158,8 @@
dump(&volatile_int8);
dump(&const_volatile_int8);
+ dump(&local_int8 + 1); // expected-error {{arithmetic on a pointer to sizeless type}}
+
*&local_int8 = local_int8;
*&const_int8 = local_int8; // expected-error {{read-only variable is not assignable}}
*&volatile_int8 = local_int8;
@@ -178,6 +180,16 @@
varargs(1, local_int8, local_int16);
+ global_int8_ptr++; // expected-error {{arithmetic on a pointer to sizeless type}}
+ global_int8_ptr--; // expected-error {{arithmetic on a pointer to sizeless type}}
+ ++global_int8_ptr; // expected-error {{arithmetic on a pointer to sizeless type}}
+ --global_int8_ptr; // expected-error {{arithmetic on a pointer to sizeless type}}
+ global_int8_ptr + 1; // expected-error {{arithmetic on a pointer to sizeless type}}
+ global_int8_ptr - 1; // expected-error {{arithmetic on a pointer to sizeless type}}
+ global_int8_ptr += 1; // expected-error {{arithmetic on a pointer to sizeless type}}
+ global_int8_ptr -= 1; // expected-error {{arithmetic on a pointer to sizeless type}}
+ global_int8_ptr - global_int8_ptr; // expected-error {{arithmetic on a pointer to sizeless type}}
+
+init_int8; // expected-error {{invalid argument type 'svint8_t'}}
++init_int8; // expected-error {{cannot increment value of type 'svint8_t'}}
init_int8++; // expected-error {{cannot increment value of type 'svint8_t'}}
Index: clang/test/Sema/sizeless-1.c
===================================================================
--- clang/test/Sema/sizeless-1.c
+++ clang/test/Sema/sizeless-1.c
@@ -137,6 +137,8 @@
dump(&volatile_int8);
dump(&const_volatile_int8);
+ dump(&local_int8 + 1); // expected-error {{arithmetic on a pointer to sizeless type}}
+
*&local_int8 = local_int8;
*&const_int8 = local_int8; // expected-error {{read-only variable is not assignable}}
*&volatile_int8 = local_int8;
@@ -158,6 +160,16 @@
noproto(local_int8);
varargs(1, local_int8, local_int16);
+ global_int8_ptr++; // expected-error {{arithmetic on a pointer to sizeless type}}
+ global_int8_ptr--; // expected-error {{arithmetic on a pointer to sizeless type}}
+ ++global_int8_ptr; // expected-error {{arithmetic on a pointer to sizeless type}}
+ --global_int8_ptr; // expected-error {{arithmetic on a pointer to sizeless type}}
+ global_int8_ptr + 1; // expected-error {{arithmetic on a pointer to sizeless type}}
+ global_int8_ptr - 1; // expected-error {{arithmetic on a pointer to sizeless type}}
+ global_int8_ptr += 1; // expected-error {{arithmetic on a pointer to sizeless type}}
+ global_int8_ptr -= 1; // expected-error {{arithmetic on a pointer to sizeless type}}
+ global_int8_ptr - global_int8_ptr; // expected-error {{arithmetic on a pointer to sizeless type}}
+
+init_int8; // expected-error {{invalid argument type 'svint8_t'}}
++init_int8; // expected-error {{cannot increment value of type 'svint8_t'}}
init_int8++; // expected-error {{cannot increment value of type 'svint8_t'}}
Index: clang/lib/Sema/SemaExpr.cpp
===================================================================
--- clang/lib/Sema/SemaExpr.cpp
+++ clang/lib/Sema/SemaExpr.cpp
@@ -9534,9 +9534,10 @@
assert(ResType->isAnyPointerType() && !ResType->isDependentType());
QualType PointeeTy = ResType->getPointeeType();
- return S.RequireCompleteType(Loc, PointeeTy,
- diag::err_typecheck_arithmetic_incomplete_type,
- PointeeTy, Operand->getSourceRange());
+ return S.RequireCompleteSizedType(
+ Loc, PointeeTy,
+ diag::err_typecheck_arithmetic_incomplete_or_sizeless_type,
+ Operand->getSourceRange());
}
/// Check the validity of an arithmetic pointer operand.
Index: clang/include/clang/Basic/DiagnosticSemaKinds.td
===================================================================
--- clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -6234,8 +6234,8 @@
"cannot %select{decrement|increment}1 value of type %0">;
def err_typecheck_expect_int : Error<
"used type %0 where integer is required">;
-def err_typecheck_arithmetic_incomplete_type : Error<
- "arithmetic on a pointer to an incomplete type %0">;
+def err_typecheck_arithmetic_incomplete_or_sizeless_type : Error<
+ "arithmetic on a pointer to %select{an incomplete|sizeless}0 type %1">;
def err_typecheck_pointer_arith_function_type : Error<
"arithmetic on%select{ a|}0 pointer%select{|s}0 to%select{ the|}2 "
"function type%select{|s}2 %1%select{| and %3}2">;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D76086.250000.patch
Type: text/x-patch
Size: 5034 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200312/41864c89/attachment-0001.bin>
More information about the cfe-commits
mailing list