diff options
author | Giovanni Bajo <giovannibajo@gcc.gnu.org> | 2004-07-06 10:51:08 +0000 |
---|---|---|
committer | Giovanni Bajo <giovannibajo@gcc.gnu.org> | 2004-07-06 10:51:08 +0000 |
commit | fddabb2c2261f782c6545104c36958b0eef1e3b6 (patch) | |
tree | 6857372bf97f5126f821d5886fbb5d1a6937ccf1 | |
parent | 2da8f02333e9f0eb20457f4cb4ebbe74a02f5c83 (diff) | |
download | gcc-fddabb2c2261f782c6545104c36958b0eef1e3b6.zip gcc-fddabb2c2261f782c6545104c36958b0eef1e3b6.tar.gz gcc-fddabb2c2261f782c6545104c36958b0eef1e3b6.tar.bz2 |
re PR c++/3671 (cannot deduce enum template parameter with multiple overloads)
PR c++/3671
* pt.c (convert_nontype_argument): Disallow conversions between
different enumeration types.
PR c++/3671
* g++.dg/template/spec14.C: New test.
From-SVN: r84150
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/pt.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/spec14.C | 18 |
4 files changed, 37 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ff63da1..f698270 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2004-07-06 Giovanni Bajo <giovannibajo@gcc.gnu.org> + + PR c++/3671 + * pt.c (convert_nontype_argument): Disallow conversions between + different enumeration types. + 2004-07-06 Nathan Sidwell <nathan@codesourcery.com> * cp-tree.h (BINFO_MARKED): Remove. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 9ecec98..0a43ede 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -3323,7 +3323,14 @@ convert_nontype_argument (tree type, tree expr) conversions (_conv.integral_) are applied. */ if (!INTEGRAL_TYPE_P (expr_type)) return error_mark_node; - + + /* [conv.integral] does not allow conversions between two different + enumeration types. */ + if (TREE_CODE (type) == ENUMERAL_TYPE + && TREE_CODE (expr_type) == ENUMERAL_TYPE + && !same_type_ignoring_top_level_qualifiers_p (type, expr_type)) + return error_mark_node; + /* It's safe to call digest_init in this case; we know we're just converting one integral constant expression to another. */ expr = digest_init (type, expr, (tree*) 0); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2a29944..4f62f1a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-07-06 Giovanni Bajo <giovannibajo@gcc.gnu.org> + + PR c++/3671 + * g++.dg/template/spec14.C: New test. + 2004-07-05 Jakub Jelinek <jakub@redhat.com> * gcc.c-torture/execute/20040629-1.c (FIELDS1, FIELDS2): Define to diff --git a/gcc/testsuite/g++.dg/template/spec14.C b/gcc/testsuite/g++.dg/template/spec14.C new file mode 100644 index 0000000..9b59565 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec14.C @@ -0,0 +1,18 @@ +// { dg-do compile } +// Origin: <weissr at informatik dot uni-tuebingen dot de> +// PR c++/3671: Non-type enum parameters must not be converted + +enum T1 {a}; +enum T2 {b}; + +struct Y { + template <T1 i> void foo() {} + template <T2 i> void foo() {} +}; + +struct Z { + template <T1 i> void foo() {} +}; + +template void Y::foo<b> (); +template void Z::foo<b> (); // { dg-error "" } |