From: Mark Mitchell Date: Thu, 17 Oct 2002 02:07:45 +0000 (+0000) Subject: mangle.c (write_expression): Correct handling of enumeration constants. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d3133e688d46aa668981d013ab331cddccdd4444;p=gcc.git mangle.c (write_expression): Correct handling of enumeration constants. * mangle.c (write_expression): Correct handling of enumeration constants. (write_template_arg): Likewise. * pt.c (convert_template_argument): Do not fold non-type template arguments when inside a template. * g++.dg/abi/mangle16.C: New test. * g++.dg/abi/mangle17.C: Likewise. From-SVN: r58234 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 80132effe86..ce7f82939d8 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2002-10-16 Mark Mitchell + * mangle.c (write_expression): Correct handling of enumeration + constants. + (write_template_arg): Likewise. + * pt.c (convert_template_argument): Do not fold non-type template + arguments when inside a template. + PR c++/7478 * cvt.c (convert_to_reference): Allow references as the incoming type. diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index 642bc735d64..bc7e970cdd9 100644 --- a/gcc/cp/mangle.c +++ b/gcc/cp/mangle.c @@ -1869,10 +1869,15 @@ write_expression (expr) || code == TEMPLATE_PARM_INDEX) write_template_param (expr); /* Handle literals. */ - else if (TREE_CODE_CLASS (code) == 'c') + else if (TREE_CODE_CLASS (code) == 'c' + || (abi_version_at_least (2) && code == CONST_DECL)) write_template_arg_literal (expr); else if (DECL_P (expr)) { + /* G++ 3.2 incorrectly mangled non-type template arguments of + enumeration type using their names. */ + if (code == CONST_DECL) + G.need_abi_warning = 1; write_char ('L'); write_mangled_name (expr); write_char ('E'); @@ -2105,15 +2110,20 @@ write_template_arg (node) else if (code == TEMPLATE_DECL) /* A template appearing as a template arg is a template template arg. */ write_template_template_arg (node); + else if ((TREE_CODE_CLASS (code) == 'c' && code != PTRMEM_CST) + || (abi_version_at_least (2) && code == CONST_DECL)) + write_template_arg_literal (node); else if (DECL_P (node)) { + /* G++ 3.2 incorrectly mangled non-type template arguments of + enumeration type using their names. */ + if (code == CONST_DECL) + G.need_abi_warning = 1; write_char ('L'); write_char ('Z'); write_encoding (node); write_char ('E'); } - else if (TREE_CODE_CLASS (code) == 'c' && code != PTRMEM_CST) - write_template_arg_literal (node); else { /* Template arguments may be expressions. */ diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index ceff84f0a06..046294e1486 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -3487,10 +3487,11 @@ convert_template_argument (parm, arg, args, complain, i, in_decl) if (invalid_nontype_parm_type_p (t, complain)) return error_mark_node; - if (processing_template_decl) + if (processing_template_decl && !abi_version_at_least (2)) arg = maybe_fold_nontype_arg (arg); - if (!uses_template_parms (arg) && !uses_template_parms (t)) + if ((!abi_version_at_least (2) || !processing_template_decl) + && (!uses_template_parms (arg) && !uses_template_parms (t))) /* We used to call digest_init here. However, digest_init will report errors, which we don't want when complain is zero. More importantly, digest_init will try too diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3f3cee43c78..2ca295ecf16 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2002-10-16 Mark Mitchell + * g++.dg/abi/mangle16.C: New test. + * g++.dg/abi/mangle17.C: Likewise. + PR c++/7478 * g++.dg/template/ref1.C: New test. diff --git a/gcc/testsuite/g++.dg/abi/mangle16.C b/gcc/testsuite/g++.dg/abi/mangle16.C new file mode 100644 index 00000000000..1d40aca55d2 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle16.C @@ -0,0 +1,14 @@ +// { dg-options "-fabi-version=0" } + +enum E { e = 3 }; + +template struct S {}; + +template void f (S) {} +template void f<7>(S); + +template void g (S) {} +template void g<7>(S); + +// { dg-final { scan-assembler _Z1fILi7EEv1SIXplL1E3ELi1EEE } } +// { dg-final { scan-assembler _Z1gILi7EEv1SIL1E3EE } } diff --git a/gcc/testsuite/g++.dg/abi/mangle17.C b/gcc/testsuite/g++.dg/abi/mangle17.C new file mode 100644 index 00000000000..1da6dea632b --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle17.C @@ -0,0 +1,11 @@ +// { dg-options "-Wabi" } + +enum E { e = 3 }; + +template struct S {}; + +template void f (S) {} +template void f<7>(S); // { dg-warning "mangle" } + +template void g (S) {} +template void g<7>(S); // { dg-warning "mangle" }