diff options
author | Mark Mitchell <mark@codesourcery.com> | 2002-10-17 02:07:45 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2002-10-17 02:07:45 +0000 |
commit | d3133e688d46aa668981d013ab331cddccdd4444 (patch) | |
tree | eda1ca44cb14c87a4d2a7dcdbf78f41890400359 | |
parent | 2982f6ffc47493a6560ad8cf290c8315be5b24e2 (diff) | |
download | gcc-d3133e688d46aa668981d013ab331cddccdd4444.zip gcc-d3133e688d46aa668981d013ab331cddccdd4444.tar.gz gcc-d3133e688d46aa668981d013ab331cddccdd4444.tar.bz2 |
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
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/mangle.c | 16 | ||||
-rw-r--r-- | gcc/cp/pt.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/abi/mangle16.C | 14 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/abi/mangle17.C | 11 |
6 files changed, 50 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 80132ef..ce7f829 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2002-10-16 Mark Mitchell <mark@codesourcery.com> + * 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 642bc73..bc7e970 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 ceff84f..046294e 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 3f3cee4..2ca295e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2002-10-16 Mark Mitchell <mark@codesourcery.com> + * 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 0000000..1d40aca --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle16.C @@ -0,0 +1,14 @@ +// { dg-options "-fabi-version=0" } + +enum E { e = 3 }; + +template <int I> struct S {}; + +template <int I> void f (S<e + 1>) {} +template void f<7>(S<e + 1>); + +template <int I> void g (S<e>) {} +template void g<7>(S<e>); + +// { 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 0000000..1da6dea --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle17.C @@ -0,0 +1,11 @@ +// { dg-options "-Wabi" } + +enum E { e = 3 }; + +template <int I> struct S {}; + +template <int I> void f (S<e + int (3.7)>) {} +template void f<7>(S<e + int (3.7)>); // { dg-warning "mangle" } + +template <int I> void g (S<e + int (3.7)>) {} +template void g<7>(S<e + int (3.7)>); // { dg-warning "mangle" } |