diff options
author | Nathan Sidwell <nathan@acm.org> | 2020-09-24 06:17:00 -0700 |
---|---|---|
committer | Nathan Sidwell <nathan@acm.org> | 2020-09-24 06:21:54 -0700 |
commit | 2e66e53b1efb98f5cf6b0a123990c1ca999affd7 (patch) | |
tree | 66754b09c5129df8e0f1e119c65e7640a0885c58 /gcc | |
parent | 9de8fa8052154a83b82f8b3785ec100d8cb24261 (diff) | |
download | gcc-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.c | 21 | ||||
-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.C | 21 |
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 (); +} |