From aaec81f10fa314fabdd9d7b07d2837b192bbd47d Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 16 Feb 2018 14:06:34 -0500 Subject: [PATCH] PR c++/82664 - ICE with reference to function template parm. * pt.c (convert_nontype_argument_function): Avoid obfuscationg NOP_EXPRs. From-SVN: r257753 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/pt.c | 7 ++++++- gcc/testsuite/g++.dg/template/nontype-fn1.C | 11 +++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/template/nontype-fn1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 141a64fbdc6..07f093a1e30 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2018-02-16 Jason Merrill + PR c++/82664 - ICE with reference to function template parm. + * pt.c (convert_nontype_argument_function): Avoid obfuscationg + NOP_EXPRs. + PR c++/82764 - C++17 ICE with empty base * class.c (build_base_field_1): Set DECL_SIZE to zero for empty base. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 268cfe5a454..89790717eca 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -6143,7 +6143,12 @@ convert_nontype_argument_function (tree type, tree expr, accept: if (TREE_CODE (type) == REFERENCE_TYPE) - fn = build_address (fn); + { + if (REFERENCE_REF_P (fn)) + fn = TREE_OPERAND (fn, 0); + else + fn = build_address (fn); + } if (!same_type_ignoring_top_level_qualifiers_p (type, TREE_TYPE (fn))) fn = build_nop (type, fn); diff --git a/gcc/testsuite/g++.dg/template/nontype-fn1.C b/gcc/testsuite/g++.dg/template/nontype-fn1.C new file mode 100644 index 00000000000..12d29a91a54 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nontype-fn1.C @@ -0,0 +1,11 @@ +// PR c++/82664 + +template < typename > struct target_disambiguator; +template < typename R, typename A1 > struct target_disambiguator< R(A1) > { + typedef A1 type; + template < R (&)() > struct layout; +}; + +int main() { + typedef target_disambiguator< void (int) > ::type target_type ; +} -- 2.30.2