diff options
author | Jason Merrill <jason@redhat.com> | 2018-02-16 14:06:34 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2018-02-16 14:06:34 -0500 |
commit | aaec81f10fa314fabdd9d7b07d2837b192bbd47d (patch) | |
tree | 7785b237492c7ae0f49fd6a005a815047b2b3251 /gcc | |
parent | dec5af9f2bea2700ff8037c4f826b97d4d621041 (diff) | |
download | gcc-aaec81f10fa314fabdd9d7b07d2837b192bbd47d.zip gcc-aaec81f10fa314fabdd9d7b07d2837b192bbd47d.tar.gz gcc-aaec81f10fa314fabdd9d7b07d2837b192bbd47d.tar.bz2 |
PR c++/82664 - ICE with reference to function template parm.
* pt.c (convert_nontype_argument_function): Avoid obfuscationg
NOP_EXPRs.
From-SVN: r257753
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/pt.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/nontype-fn1.C | 11 |
3 files changed, 21 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 141a64f..07f093a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2018-02-16 Jason Merrill <jason@redhat.com> + 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 268cfe5..8979071 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 0000000..12d29a9 --- /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 ; +} |