llvm-project/clang/test/SemaCXX/disallow_void_deref.cpp
Erich Keane fca4e2add0 Make dereferencing a void* a hard-error instead of warn-as-error
Clang 16 changed to consider dereferencing a void* to be a
warning-as-error, plus made this an error in SFINAE contexts, since this
resulted in incorrect template instantiation.  When doing so, the Clang
16 documentation was updated to reflect that this was likely to change
again to a non-disablable error in the next version.

As there has been no response to changing from a warning to an error, I
believe this is a non-controversial change.

This patch changes this to be an Error, consistent with the standard and
other compilers.

This was discussed in this RFC:
https://discourse.llvm.org/t/rfc-can-we-stop-the-extension-to-allow-dereferencing-void-in-c/65708

Differential Revision: https://reviews.llvm.org/D150875
2023-05-24 11:27:13 -07:00

16 lines
508 B
C++

// RUN: %clang_cc1 -fsyntax-only -verify -std=c++20 %s
void f(void* p) {
(void)*p; // expected-error{{indirection not permitted on operand of type 'void *'}}
}
template<class T>
concept deref = requires (T& t) {
{ *t }; // #FAILED_REQ
};
static_assert(deref<void*>);
// expected-error@-1{{static assertion failed}}
// expected-note@-2{{because 'void *' does not satisfy 'deref'}}
// expected-note@#FAILED_REQ{{because '*t' would be invalid: indirection not permitted on operand of type 'void *'}}