aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2020-09-24 06:17:00 -0700
committerNathan Sidwell <nathan@acm.org>2020-09-24 06:21:54 -0700
commit2e66e53b1efb98f5cf6b0a123990c1ca999affd7 (patch)
tree66754b09c5129df8e0f1e119c65e7640a0885c58 /gcc
parent9de8fa8052154a83b82f8b3785ec100d8cb24261 (diff)
downloadgcc-2e66e53b1efb98f5cf6b0a123990c1ca999affd7.zip
gcc-2e66e53b1efb98f5cf6b0a123990c1ca999affd7.tar.gz
gcc-2e66e53b1efb98f5cf6b0a123990c1ca999affd7.tar.bz2
c++: local-decls are never member fns [PR97186]
This fixes an ICE in noexcept instantiation. It was presuming functions always have template_info, but that changed with my DECL_LOCAL_DECL_P changes. Fortunately DECL_LOCAL_DECL_P fns are never member fns, so we don't need to go fishing out a this pointer. Also I realized I'd misnamed local10.C, so renaming it local-fn3.C, and while there adding the effective-target lto that David E pointed out was missing. PR c++/97186 gcc/cp/ * pt.c (maybe_instantiate_noexcept): Local externs are never member fns. gcc/testsuite/ * g++.dg/template/local10.C: Rename ... * g++.dg/template/local-fn3.C: .. here. Require lto. * g++.dg/template/local-fn4.C: New.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/pt.c21
-rw-r--r--gcc/testsuite/g++.dg/template/local-fn3.C (renamed from gcc/testsuite/g++.dg/template/local10.C)2
-rw-r--r--gcc/testsuite/g++.dg/template/local-fn4.C21
3 files changed, 36 insertions, 8 deletions
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 1ec039d..62e8509 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -25397,15 +25397,20 @@ maybe_instantiate_noexcept (tree fn, tsubst_flags_t complain)
push_deferring_access_checks (dk_no_deferred);
input_location = DECL_SOURCE_LOCATION (fn);
- /* If needed, set current_class_ptr for the benefit of
- tsubst_copy/PARM_DECL. */
- tree tdecl = DECL_TEMPLATE_RESULT (DECL_TI_TEMPLATE (fn));
- if (DECL_NONSTATIC_MEMBER_FUNCTION_P (tdecl))
+ if (!DECL_LOCAL_DECL_P (fn))
{
- tree this_parm = DECL_ARGUMENTS (tdecl);
- current_class_ptr = NULL_TREE;
- current_class_ref = cp_build_fold_indirect_ref (this_parm);
- current_class_ptr = this_parm;
+ /* If needed, set current_class_ptr for the benefit of
+ tsubst_copy/PARM_DECL. The exception pattern will
+ refer to the parm of the template, not the
+ instantiation. */
+ tree tdecl = DECL_TEMPLATE_RESULT (DECL_TI_TEMPLATE (fn));
+ if (DECL_NONSTATIC_MEMBER_FUNCTION_P (tdecl))
+ {
+ tree this_parm = DECL_ARGUMENTS (tdecl);
+ current_class_ptr = NULL_TREE;
+ current_class_ref = cp_build_fold_indirect_ref (this_parm);
+ current_class_ptr = this_parm;
+ }
}
/* If this function is represented by a TEMPLATE_DECL, then
diff --git a/gcc/testsuite/g++.dg/template/local10.C b/gcc/testsuite/g++.dg/template/local-fn3.C
index a2ffc1e..2affe23 100644
--- a/gcc/testsuite/g++.dg/template/local10.C
+++ b/gcc/testsuite/g++.dg/template/local-fn3.C
@@ -1,4 +1,6 @@
// PR c++/97171
+
+// { dg-require-effective-target lto }
// { dg-additional-options -flto }
template <typename _UnaryOperation>
diff --git a/gcc/testsuite/g++.dg/template/local-fn4.C b/gcc/testsuite/g++.dg/template/local-fn4.C
new file mode 100644
index 0000000..4699012
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/local-fn4.C
@@ -0,0 +1,21 @@
+// PR c++/97186
+// ICE in exception spec substitution
+
+
+template <class GG>
+struct no {
+ static void
+ tg ()
+ {
+ void
+ hk () noexcept (tg); // { dg-error "convert" }
+
+ hk ();
+ }
+};
+
+void
+os ()
+{
+ no<int> ().tg ();
+}