aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2023-06-29 16:10:18 -0400
committerPatrick Palka <ppalka@redhat.com>2023-06-29 16:10:18 -0400
commit9479da4515f7d019b4ef282d0e21536431c44f71 (patch)
tree7f0fc613a62b16dffb982faba3215a7a4f90063f /gcc
parentfd8a1be04d4cdbfefea457b99ed8404d77b35dd6 (diff)
downloadgcc-9479da4515f7d019b4ef282d0e21536431c44f71.zip
gcc-9479da4515f7d019b4ef282d0e21536431c44f71.tar.gz
gcc-9479da4515f7d019b4ef282d0e21536431c44f71.tar.bz2
c++: NSDMI instantiation during overload resolution [PR110468]
Here we find ourselves instantiating the NSDMI for A<1>::m when computing argument conversions during overload resolution, and thus tf_conv is set. The flag causes mark_used for the constructor used in the NSDMI to exit early and not instantiate its noexcept-spec, which eventually leads to an ICE from nothrow_spec_p. This patch fixes this by clearing any special tsubst flags during instantiation of an NSDMI, since the result should be independent of the context that requires the instantiation. PR c++/110468 gcc/cp/ChangeLog: * init.cc (maybe_instantiate_nsdmi_init): Mask out all tsubst flags except for tf_warning_or_error. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/noexcept79.C: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/init.cc4
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/noexcept79.C18
2 files changed, 22 insertions, 0 deletions
diff --git a/gcc/cp/init.cc b/gcc/cp/init.cc
index af6e30f..ff5014c 100644
--- a/gcc/cp/init.cc
+++ b/gcc/cp/init.cc
@@ -579,6 +579,10 @@ maybe_instantiate_nsdmi_init (tree member, tsubst_flags_t complain)
/* tsubst_decl uses void_node to indicate an uninstantiated DMI. */
if (init == void_node)
{
+ /* Clear any special tsubst flags; the result of NSDMI instantiation
+ should be independent of the substitution context. */
+ complain &= tf_warning_or_error;
+
init = DECL_INITIAL (DECL_TI_TEMPLATE (member));
location_t expr_loc
= cp_expr_loc_or_loc (init, DECL_SOURCE_LOCATION (member));
diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept79.C b/gcc/testsuite/g++.dg/cpp0x/noexcept79.C
new file mode 100644
index 0000000..d1f54d1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/noexcept79.C
@@ -0,0 +1,18 @@
+// PR c++/110468
+// { dg-do compile { target c++11 } }
+
+template<int T>
+struct variant {
+ variant() noexcept(T > 0);
+};
+
+template<int N>
+struct A {
+ variant<N> m = {};
+};
+
+struct B {
+ B(A<1>);
+};
+
+B b = {{}};