aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiovanni Bajo <giovannibajo@gcc.gnu.org>2004-07-06 10:51:08 +0000
committerGiovanni Bajo <giovannibajo@gcc.gnu.org>2004-07-06 10:51:08 +0000
commitfddabb2c2261f782c6545104c36958b0eef1e3b6 (patch)
tree6857372bf97f5126f821d5886fbb5d1a6937ccf1
parent2da8f02333e9f0eb20457f4cb4ebbe74a02f5c83 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cp/pt.c9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/template/spec14.C18
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 "" }