aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2023-11-15 12:24:38 -0500
committerPatrick Palka <ppalka@redhat.com>2023-11-15 12:24:38 -0500
commitb126f3ffbef59b0b08c2c2a664133d7d6f5ca235 (patch)
treeeaf2d443fca590d755f137401793a03c219e4350
parent40a7707a7ea3568cee2cd80cd7e83b7eda678410 (diff)
downloadgcc-b126f3ffbef59b0b08c2c2a664133d7d6f5ca235.zip
gcc-b126f3ffbef59b0b08c2c2a664133d7d6f5ca235.tar.gz
gcc-b126f3ffbef59b0b08c2c2a664133d7d6f5ca235.tar.bz2
c++: direct enum init from type-dep elt [PR112515]
The NON_DEPENDENT_EXPR removal exposed that is_direct_enum_init can be called in a template context on a CONSTRUCTOR that isn't type-dependent but whose element is. PR c++/112515 gcc/cp/ChangeLog: * decl.cc (is_direct_enum_init): Check type-dependence of the single element. gcc/testsuite/ChangeLog: * g++.dg/template/non-dependent30.C: New test.
-rw-r--r--gcc/cp/decl.cc1
-rw-r--r--gcc/testsuite/g++.dg/template/non-dependent30.C9
2 files changed, 10 insertions, 0 deletions
diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc
index d2ed46b..b8e1098 100644
--- a/gcc/cp/decl.cc
+++ b/gcc/cp/decl.cc
@@ -6614,6 +6614,7 @@ is_direct_enum_init (tree type, tree init)
&& CONSTRUCTOR_NELTS (init) == 1
/* DR 2374: The single element needs to be implicitly
convertible to the underlying type of the enum. */
+ && !type_dependent_expression_p (CONSTRUCTOR_ELT (init, 0)->value)
&& can_convert_arg (ENUM_UNDERLYING_TYPE (type),
TREE_TYPE (CONSTRUCTOR_ELT (init, 0)->value),
CONSTRUCTOR_ELT (init, 0)->value,
diff --git a/gcc/testsuite/g++.dg/template/non-dependent30.C b/gcc/testsuite/g++.dg/template/non-dependent30.C
new file mode 100644
index 0000000..32d48e4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/non-dependent30.C
@@ -0,0 +1,9 @@
+// PR c++/112515
+// { dg-do compile { target c++11 } }
+
+enum E : int { };
+
+template<class T>
+E f(T t) {
+ return E{t.e};
+}