erichkeane updated this revision to Diff 465725.
erichkeane marked 2 inline comments as done.
erichkeane added a comment.
Fix based on Aaron's comments.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D135287/new/
https://reviews.llvm.org/D135287
Files:
clang/docs/ReleaseNotes.rst
clang/include/clang/Basic/DiagnosticGroups.td
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/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-warning {{ISO C++ does not allow}}
- (void)*reinterpret_cast<void*>(&b); // expected-warning {{ISO C++ does not allow}}
- (void)*reinterpret_cast<void*>(&l); // expected-warning {{ISO C++ does not allow}}
- (void)*reinterpret_cast<void*>(&d); // expected-warning {{ISO C++ does not allow}}
- (void)*reinterpret_cast<void*>(&f); // expected-warning {{ISO C++ does not allow}}
+ (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_allowlist () {
Index: clang/test/SemaCXX/disallow_void_deref.cpp
===================================================================
--- /dev/null
+++ clang/test/SemaCXX/disallow_void_deref.cpp
@@ -0,0 +1,16 @@
+// 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
+
+void f(void* p) {
+ (void)*p; // enabled-error{{ISO C++ does not allow indirection on operand of type 'void *'}}
+}
+
+template<class T>
+concept deref = requires (T& t) {
+ { *t }; // #FAILED_REQ
+};
+
+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 *'}}
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-warning{{indirection on operand of type 'void *'}} expected-error{{not assignable}}
+ *t = u; // expected-error{{indirection 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
@@ -14536,9 +14536,12 @@
// [...] the expression to which [the unary * operator] is applied shall
// be a pointer to an object type, or a pointer to a function type
LangOptions LO = S.getLangOpts();
- if (LO.CPlusPlus || !(LO.C99 && (IsAfterAmp || S.isUnevaluatedContext())))
+ if (LO.CPlusPlus)
+ S.Diag(OpLoc, diag::ext_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)
- << LO.CPlusPlus << OpTy << Op->getSourceRange();
+ << OpTy << Op->getSourceRange();
}
// Dereferences are usually l-values...
Index: clang/include/clang/Basic/DiagnosticSemaKinds.td
===================================================================
--- clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -6932,8 +6932,11 @@
def err_typecheck_indirection_requires_pointer : Error<
"indirection requires pointer operand (%0 invalid)">;
def ext_typecheck_indirection_through_void_pointer : ExtWarn<
- "ISO %select{C|C++}0 does not allow indirection on operand of type %1">,
- InGroup<DiagGroup<"void-ptr-dereference">>;
+ "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 warn_indirection_through_null : Warning<
"indirection of non-volatile null pointer will be deleted, not trap">,
InGroup<NullDereference>;
Index: clang/include/clang/Basic/DiagnosticGroups.td
===================================================================
--- clang/include/clang/Basic/DiagnosticGroups.td
+++ clang/include/clang/Basic/DiagnosticGroups.td
@@ -961,6 +961,7 @@
[VoidPointerToEnumCast]>;
def PointerToIntCast : DiagGroup<"pointer-to-int-cast",
[PointerToEnumCast, VoidPointerToIntCast]>;
+def VoidPointerDeref : DiagGroup<"void-ptr-dereference">;
def FUseLdPath : DiagGroup<"fuse-ld-path">;
Index: clang/docs/ReleaseNotes.rst
===================================================================
--- clang/docs/ReleaseNotes.rst
+++ clang/docs/ReleaseNotes.rst
@@ -86,6 +86,17 @@
typedef char int8_a16 __attribute__((aligned(16)));
int8_a16 array[4]; // Now diagnosed as the element size not being a multiple of the array alignment.
+- Clang now diagnoses indirection of ``void *`` in C++ mode as a warning which
+ defaults to an error. This is compatible with ISO C++, GCC, ICC, and MSVC. This
+ is also now a SFINAE error so constraint checking and SFINAE checking can be
+ compatible with other compilers. It is expected that this will be upgraded to
+ an error-only diagnostic in the next Clang release.
+
+ .. code-block:: c++
+
+ void func(void *p) {
+ *p; // Now diagnosed as a warning-as-error.
+ }
What's New in Clang |release|?
==============================
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits