https://gcc.gnu.org/g:e548a881a4540378151f6195e47e8413fe75a0d6

commit r14-10544-ge548a881a4540378151f6195e47e8413fe75a0d6
Author: Patrick Palka <ppa...@redhat.com>
Date:   Tue Jul 23 11:37:31 2024 -0400

    c++: missing SFINAE during alias CTAD [PR115296]
    
    During the alias CTAD transformation, if substitution failed for some
    guide we should just silently discard the guide.  We currently do
    discard the guide, but not silently, as in the below testcase which
    we diagnose forming a too-large array type when transforming the
    user-defined deduction guides.
    
    This patch fixes this by using complain=tf_none instead of
    tf_warning_or_error throughout alias_ctad_tweaks.
    
            PR c++/115296
    
    gcc/cp/ChangeLog:
    
            * pt.cc (alias_ctad_tweaks): Use complain=tf_none instead of
            tf_warning_or_error.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/cpp2a/class-deduction-alias23.C: New test.
    
    Reviewed-by: Jason Merrill <ja...@redhat.com>
    (cherry picked from commit f70281222df432a7bec1271904c5ebefd7f2c934)

Diff:
---
 gcc/cp/pt.cc                                         |  2 +-
 gcc/testsuite/g++.dg/cpp2a/class-deduction-alias23.C | 19 +++++++++++++++++++
 2 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index 713946a1ff17..13907858273e 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -30369,7 +30369,7 @@ alias_ctad_tweaks (tree tmpl, tree uguides)
                          (INNERMOST_TEMPLATE_PARMS (fullatparms)));
     }
 
-  tsubst_flags_t complain = tf_warning_or_error;
+  tsubst_flags_t complain = tf_none;
   tree aguides = NULL_TREE;
   tree atparms = INNERMOST_TEMPLATE_PARMS (fullatparms);
   unsigned natparms = TREE_VEC_LENGTH (atparms);
diff --git a/gcc/testsuite/g++.dg/cpp2a/class-deduction-alias23.C 
b/gcc/testsuite/g++.dg/cpp2a/class-deduction-alias23.C
new file mode 100644
index 000000000000..117212c67de7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/class-deduction-alias23.C
@@ -0,0 +1,19 @@
+// PR c++/115296
+// { dg-do compile { target c++20 } }
+
+using size_t = decltype(sizeof(0));
+
+template<class T, size_t N = size_t(-1)>
+struct span { span(T); };
+
+template<class T, size_t N>
+span(T(&)[N]) -> span<T, N>; // { dg-bogus "array exceeds maximum" }
+
+template<class T, size_t N>
+requires (sizeof(T[N]) != 42) // { dg-bogus "array exceeds maximum" }
+span(T*) -> span<T, N>;
+
+template<class T>
+using array_view = span<T>;
+
+array_view x = 0;

Reply via email to