diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -60,6 +60,10 @@ ----------------------------------------- - Clang won't search for coroutine_traits in std::experimental namespace any more. Clang will only search for std::coroutine_traits for coroutines then. +- Clang no longer allows dereferencing of a ``void *`` as an extension. Clang 16 + converted this to a default-error as ``-Wvoid-ptr-dereference``, as well as a + SFINAE error. This flag is still valid however, as it disables the equivalent + warning in C. ABI Changes in This Version --------------------------- diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -6981,9 +6981,8 @@ def ext_typecheck_indirection_through_void_pointer : ExtWarn< "ISO C does not allow indirection on operand of type %0">, InGroup; -def ext_typecheck_indirection_through_void_pointer_cpp - : ExtWarn<"ISO C++ does not allow indirection on operand of type %0">, - InGroup, DefaultError, SFINAEFailure; +def err_typecheck_indirection_through_void_pointer_cpp + : Error<"indirection not permitted on operand of type %0">; def warn_indirection_through_null : Warning< "indirection of non-volatile null pointer will be deleted, not trap">, InGroup; diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -14957,7 +14957,7 @@ // be a pointer to an object type, or a pointer to a function type LangOptions LO = S.getLangOpts(); if (LO.CPlusPlus) - S.Diag(OpLoc, diag::ext_typecheck_indirection_through_void_pointer_cpp) + S.Diag(OpLoc, diag::err_typecheck_indirection_through_void_pointer_cpp) << OpTy << Op->getSourceRange(); else if (!(LO.C99 && IsAfterAmp) && !S.isUnevaluatedContext()) S.Diag(OpLoc, diag::ext_typecheck_indirection_through_void_pointer) diff --git a/clang/test/CXX/temp/temp.decls/temp.class/temp.mem.func/p1inst.cpp b/clang/test/CXX/temp/temp.decls/temp.class/temp.mem.func/p1inst.cpp --- a/clang/test/CXX/temp/temp.decls/temp.class/temp.mem.func/p1inst.cpp +++ b/clang/test/CXX/temp/temp.decls/temp.class/temp.mem.func/p1inst.cpp @@ -8,7 +8,7 @@ template void X0::f(T *t, const U &u) { - *t = u; // expected-error{{indirection on operand of type 'void *'}} expected-error{{not assignable}} + *t = u; // expected-error{{indirection not permitted on operand of type 'void *'}} expected-error{{not assignable}} } void test_f(X0 xfi, X0 xvi, float *fp, void *vp, int i) { diff --git a/clang/test/SemaCXX/decl-expr-ambiguity.cpp b/clang/test/SemaCXX/decl-expr-ambiguity.cpp --- a/clang/test/SemaCXX/decl-expr-ambiguity.cpp +++ b/clang/test/SemaCXX/decl-expr-ambiguity.cpp @@ -35,7 +35,7 @@ extern T f3(); __typeof(*T()) f4(); // expected-warning {{empty parentheses interpreted as a function declaration}} expected-note {{replace parentheses with an initializer}} typedef void *V; - __typeof(*V()) f5(); // expected-error {{ISO C++ does not allow indirection on operand of type 'V' (aka 'void *')}} + __typeof(*V()) f5(); // expected-error {{indirection not permitted on operand of type 'V' (aka 'void *')}} T multi1, multi2(); // expected-warning {{empty parentheses interpreted as a function declaration}} expected-note {{replace parentheses with an initializer}} T(d)[5]; // expected-error {{redefinition of 'd'}} diff --git a/clang/test/SemaCXX/disallow_void_deref.cpp b/clang/test/SemaCXX/disallow_void_deref.cpp --- a/clang/test/SemaCXX/disallow_void_deref.cpp +++ b/clang/test/SemaCXX/disallow_void_deref.cpp @@ -1,8 +1,7 @@ -// RUN: %clang_cc1 -fsyntax-only -verify=enabled,sfinae -std=c++20 %s -// RUN: %clang_cc1 -fsyntax-only -verify=sfinae -std=c++20 -Wno-void-ptr-dereference %s +// RUN: %clang_cc1 -fsyntax-only -verify -std=c++20 %s void f(void* p) { - (void)*p; // enabled-error{{ISO C++ does not allow indirection on operand of type 'void *'}} + (void)*p; // expected-error{{indirection not permitted on operand of type 'void *'}} } template @@ -11,6 +10,6 @@ }; static_assert(deref); -// sfinae-error@-1{{static assertion failed}} -// sfinae-note@-2{{because 'void *' does not satisfy 'deref'}} -// sfinae-note@#FAILED_REQ{{because '*t' would be invalid: ISO C++ does not allow indirection on operand of type '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 *'}} diff --git a/clang/test/SemaCXX/reinterpret-cast.cpp b/clang/test/SemaCXX/reinterpret-cast.cpp --- a/clang/test/SemaCXX/reinterpret-cast.cpp +++ b/clang/test/SemaCXX/reinterpret-cast.cpp @@ -214,11 +214,11 @@ (void)*reinterpret_cast(v_ptr); // Casting to void pointer - (void)*reinterpret_cast(&a); // expected-error {{ISO C++ does not allow}} - (void)*reinterpret_cast(&b); // expected-error {{ISO C++ does not allow}} - (void)*reinterpret_cast(&l); // expected-error {{ISO C++ does not allow}} - (void)*reinterpret_cast(&d); // expected-error {{ISO C++ does not allow}} - (void)*reinterpret_cast(&f); // expected-error {{ISO C++ does not allow}} + (void)*reinterpret_cast(&a); // expected-error {{indirection not permitted on operand of type 'void *'}} + (void)*reinterpret_cast(&b); // expected-error {{indirection not permitted on operand of type 'void *'}} + (void)*reinterpret_cast(&l); // expected-error {{indirection not permitted on operand of type 'void *'}} + (void)*reinterpret_cast(&d); // expected-error {{indirection not permitted on operand of type 'void *'}} + (void)*reinterpret_cast(&f); // expected-error {{indirection not permitted on operand of type 'void *'}} } void reinterpret_cast_allowlist () {