erichkeane updated this revision to Diff 524667. erichkeane added a comment.
Fix tests + Aaron's formatting request. Guess I forgot to upload this last night! CHANGES SINCE LAST ACTION https://reviews.llvm.org/D150875/new/ https://reviews.llvm.org/D150875 Files: clang/docs/ReleaseNotes.rst clang/include/clang/Basic/DiagnosticSemaKinds.td clang/lib/Sema/SemaExpr.cpp clang/test/CXX/temp/temp.decls/temp.class/temp.mem.func/p1inst.cpp clang/test/SemaCXX/decl-expr-ambiguity.cpp clang/test/SemaCXX/disallow_void_deref.cpp clang/test/SemaCXX/reinterpret-cast.cpp
Index: clang/test/SemaCXX/reinterpret-cast.cpp =================================================================== --- clang/test/SemaCXX/reinterpret-cast.cpp +++ clang/test/SemaCXX/reinterpret-cast.cpp @@ -214,11 +214,11 @@ (void)*reinterpret_cast<float*>(v_ptr); // Casting to void pointer - (void)*reinterpret_cast<void*>(&a); // expected-error {{ISO C++ does not allow}} - (void)*reinterpret_cast<void*>(&b); // expected-error {{ISO C++ does not allow}} - (void)*reinterpret_cast<void*>(&l); // expected-error {{ISO C++ does not allow}} - (void)*reinterpret_cast<void*>(&d); // expected-error {{ISO C++ does not allow}} - (void)*reinterpret_cast<void*>(&f); // expected-error {{ISO C++ does not allow}} + (void)*reinterpret_cast<void*>(&a); // expected-error {{indirection not permitted on operand of type 'void *'}} + (void)*reinterpret_cast<void*>(&b); // expected-error {{indirection not permitted on operand of type 'void *'}} + (void)*reinterpret_cast<void*>(&l); // expected-error {{indirection not permitted on operand of type 'void *'}} + (void)*reinterpret_cast<void*>(&d); // expected-error {{indirection not permitted on operand of type 'void *'}} + (void)*reinterpret_cast<void*>(&f); // expected-error {{indirection not permitted on operand of type 'void *'}} } void reinterpret_cast_allowlist () { Index: clang/test/SemaCXX/disallow_void_deref.cpp =================================================================== --- clang/test/SemaCXX/disallow_void_deref.cpp +++ 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<class T> @@ -11,6 +10,6 @@ }; static_assert(deref<void*>); -// 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 *'}} Index: clang/test/SemaCXX/decl-expr-ambiguity.cpp =================================================================== --- clang/test/SemaCXX/decl-expr-ambiguity.cpp +++ 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'}} Index: clang/test/CXX/temp/temp.decls/temp.class/temp.mem.func/p1inst.cpp =================================================================== --- clang/test/CXX/temp/temp.decls/temp.class/temp.mem.func/p1inst.cpp +++ clang/test/CXX/temp/temp.decls/temp.class/temp.mem.func/p1inst.cpp @@ -8,7 +8,7 @@ template<typename T, typename U> void X0<T, U>::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<float, int> xfi, X0<void, int> xvi, float *fp, void *vp, int i) { Index: clang/lib/Sema/SemaExpr.cpp =================================================================== --- clang/lib/Sema/SemaExpr.cpp +++ 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) Index: clang/include/clang/Basic/DiagnosticSemaKinds.td =================================================================== --- clang/include/clang/Basic/DiagnosticSemaKinds.td +++ 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<VoidPointerDeref>; -def ext_typecheck_indirection_through_void_pointer_cpp - : ExtWarn<"ISO C++ does not allow indirection on operand of type %0">, - InGroup<VoidPointerDeref>, 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<NullDereference>; Index: clang/docs/ReleaseNotes.rst =================================================================== --- clang/docs/ReleaseNotes.rst +++ clang/docs/ReleaseNotes.rst @@ -55,6 +55,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 ---------------------------
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits