[PATCH] D76084: [Sema][SVE] Reject subscripts on pointers to sizeless types
Richard Sandiford via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Mar 16 02:10:30 PDT 2020
rsandifo-arm added a comment.
In D76084#1920103 <https://reviews.llvm.org/D76084#1920103>, @efriedma wrote:
> I'm not sure we actually want to reject this; let's discuss on the review for D76086 <https://reviews.llvm.org/D76086>, since subscripting is sort of a special case of arithmetic.
A silly corner case for this is:
template<typename T>
constexpr __SIZE_TYPE__ f(T *x) { return &x[1] - x; }
typedef int arr1[f((int *)0) - 1];
typedef int arr2[f((__SVInt8_t *)0) - 1];
which gives:
a.cpp:2:48: warning: subtraction of pointers to type '__SVInt8_t' of zero size has undefined behavior [-Wpointer-arith]
constexpr __SIZE_TYPE__ f(T *x) { return &x[1] - x; }
~~~~~ ^ ~
a.cpp:4:18: note: in instantiation of function template specialization 'f<__SVInt8_t>' requested here
typedef int arr2[f((__SVInt8_t *)0) - 1];
^
a.cpp:4:13: error: variable length array declaration not allowed at file scope
typedef int arr2[f((__SVInt8_t *)0) - 1];
^
No real code would do anything like this of course. But I think it shows that it's going to be difficult to divide cases that measure `sizeof` only during CodeGen from those that measure it during Sema. With more and more things being accepted as constexprs, I think it's safer to treat any measure of `sizeof` as being at least potentially computable at compile time.
There's also the argument that this is what the spec says. I realise that's a fairly weak argument though, since the spec could always be changed.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D76084/new/
https://reviews.llvm.org/D76084
More information about the cfe-commits
mailing list