aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2019-08-06 10:07:59 -0400
committerJason Merrill <jason@gcc.gnu.org>2019-08-06 10:07:59 -0400
commitd40e36310722e63675d62711cad7d25393836a00 (patch)
tree5780be4efd59ee7d28deecce3135aeecd8b8102d /gcc
parent1a013865bed6ae419945945e418d078bf30f8b89 (diff)
downloadgcc-d40e36310722e63675d62711cad7d25393836a00.zip
gcc-d40e36310722e63675d62711cad7d25393836a00.tar.gz
gcc-d40e36310722e63675d62711cad7d25393836a00.tar.bz2
PR c++/91378 - ICE with noexcept and auto return type.
Here, since the call to g is not type-dependent, we call mark_used on it to determine its return type. This also wants to instantiate the noexcept-expression. But since nothing in maybe_instantiate_noexcept was calling push_to_top_level, we substituted b.i with processing_template_decl set, so we left it unresolved for later access checking. As a result, the type of C::g<int> remained instantiation-dependent, leading to an ICE in type_dependent_expression_p on the assert that the type of a function template with no dependent template arguments must be non-dependent. * pt.c (maybe_instantiate_noexcept): push_to_top_level. From-SVN: r274143
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/pt.c7
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/auto-fn56.C19
3 files changed, 26 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index e541932..9b0a34c 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2019-08-06 Jason Merrill <jason@redhat.com>
+
+ PR c++/91378 - ICE with noexcept and auto return type.
+ * pt.c (maybe_instantiate_noexcept): push_to_top_level.
+
2019-08-06 Paolo Carlini <paolo.carlini@oracle.com>
* decl.c (check_array_designated_initializer): Use
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 903e589..b71fbaad 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -24315,12 +24315,11 @@ maybe_instantiate_noexcept (tree fn, tsubst_flags_t complain)
}
else if (push_tinst_level (fn))
{
+ push_to_top_level ();
push_access_scope (fn);
push_deferring_access_checks (dk_no_deferred);
input_location = DECL_SOURCE_LOCATION (fn);
- tree save_ccp = current_class_ptr;
- tree save_ccr = current_class_ref;
/* If needed, set current_class_ptr for the benefit of
tsubst_copy/PARM_DECL. */
tree tdecl = DECL_TEMPLATE_RESULT (DECL_TI_TEMPLATE (fn));
@@ -24346,9 +24345,6 @@ maybe_instantiate_noexcept (tree fn, tsubst_flags_t complain)
/*function_p=*/false,
/*i_c_e_p=*/true);
- current_class_ptr = save_ccp;
- current_class_ref = save_ccr;
-
/* Build up the noexcept-specification. */
spec = build_noexcept_spec (noex, tf_warning_or_error);
@@ -24358,6 +24354,7 @@ maybe_instantiate_noexcept (tree fn, tsubst_flags_t complain)
pop_deferring_access_checks ();
pop_access_scope (fn);
pop_tinst_level ();
+ pop_from_top_level ();
}
else
spec = noexcept_false_spec;
diff --git a/gcc/testsuite/g++.dg/cpp1y/auto-fn56.C b/gcc/testsuite/g++.dg/cpp1y/auto-fn56.C
new file mode 100644
index 0000000..69bdd95
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/auto-fn56.C
@@ -0,0 +1,19 @@
+// PR c++/91378
+// { dg-do compile { target c++14 } }
+
+struct B
+{
+ int i;
+};
+
+struct C
+{
+ template <class T> static auto
+ g(B b) noexcept(noexcept(b.i)) { }
+};
+
+template <class T>
+void h(T t)
+{
+ C::g<int>({});
+}