https://github.com/cor3ntin updated https://github.com/llvm/llvm-project/pull/121333
>From 8298d9815c4f7f53e6f086260a7ea341ba75b9ad Mon Sep 17 00:00:00 2001 From: Corentin Jabot <corentinja...@gmail.com> Date: Mon, 30 Dec 2024 12:31:23 +0100 Subject: [PATCH] [Clang] Make passing incomplete types to builtin type-traits a non-sfinae-friendly error LWG3929 suggests that passing incomplete types to __is_base_of and other builtins supporting [meta.unary] should result in a non-sfinaeable error. This is consistent with GCC's behavior and avoid inconsistency when using a builtin instead of a standard trait in a concept-definition. Fixes #121278 --- clang/docs/ReleaseNotes.rst | 3 +++ clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 +- clang/test/SemaCXX/type-traits.cpp | 15 +++++++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index b7da12bcf65818..e41d355ac424d6 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -886,6 +886,9 @@ Bug Fixes to C++ Support out of a module (which is the case e.g. in MSVC's implementation of ``std`` module). (#GH118218) - Fixed a pack expansion issue in checking unexpanded parameter sizes. (#GH17042) - Fixed a bug where captured structured bindings were modifiable inside non-mutable lambda (#GH95081) +- Passing incomplete types to ``__is_base_of`` and other builtin type traits for which the corresponding + standard type trait mandates a complete type is now a hard (non-sfinae-friendly) error + (`LWG3929 <https://wg21.link/LWG3929>`__.) (#GH121278) Bug Fixes to AST Handling ^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 330ae045616aba..03fb7ca9bc3c3b 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -9361,7 +9361,7 @@ def note_inequality_comparison_to_or_assign : Note< "use '|=' to turn this inequality comparison into an or-assignment">; def err_incomplete_type_used_in_type_trait_expr : Error< - "incomplete type %0 used in type trait expression">; + "incomplete type %0 used in type trait expression">, NoSFINAE; // C++20 constinit and require_constant_initialization attribute def warn_cxx20_compat_constinit : Warning< diff --git a/clang/test/SemaCXX/type-traits.cpp b/clang/test/SemaCXX/type-traits.cpp index 91ef7786f11bb9..1b9e2ba6ff162f 100644 --- a/clang/test/SemaCXX/type-traits.cpp +++ b/clang/test/SemaCXX/type-traits.cpp @@ -5031,3 +5031,18 @@ void remove_all_extents() { using SomeArray = int[1][2]; static_assert(__is_same(remove_all_extents_t<const SomeArray>, const int)); } + +namespace GH121278 { +// https://cplusplus.github.io/LWG/lwg-active.html#3929 +#if __cplusplus >= 202002L +template <typename B, typename D> +concept C = __is_base_of(B, D); +// expected-error@-1 {{incomplete type 'GH121278::S' used in type trait expression}} +// expected-note@-2 {{while substituting template arguments into constraint expression here}} + +struct T; +struct S; +bool b = C<T, S>; +// expected-note@-1 {{while checking the satisfaction of concept 'C<GH121278::T, GH121278::S>' requested here}} +#endif +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits