aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiovanni Bajo <giovannibajo@gcc.gnu.org>2004-03-19 09:58:50 +0000
committerGiovanni Bajo <giovannibajo@gcc.gnu.org>2004-03-19 09:58:50 +0000
commitd36d56001a298d89b6d69750cb6dfee4653aa2b8 (patch)
tree2875ba12f6981d9b9cdec73133129e43d4a3728c
parent26bcf8fc16a06d4fe16ac25ce79739e2e6cb7445 (diff)
downloadgcc-d36d56001a298d89b6d69750cb6dfee4653aa2b8.zip
gcc-d36d56001a298d89b6d69750cb6dfee4653aa2b8.tar.gz
gcc-d36d56001a298d89b6d69750cb6dfee4653aa2b8.tar.bz2
re PR c++/14545 (Cannot compile pooma-gcc (regression))
PR c++/14545 * parser.c (cp_parser_functional_cast): A cast to anything but integral or enumaration type is not an integral constant expression. * pt.c (value_dependent_expression_p): Handle cast expressions without operands (such as "int()"). PR c++/14545 * g++.dg/parse/template15.C: New test. From-SVN: r79672
-rw-r--r--gcc/cp/ChangeLog9
-rw-r--r--gcc/cp/parser.c13
-rw-r--r--gcc/cp/pt.c13
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/parse/template15.C26
5 files changed, 64 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 3822563..77e30a5 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,12 @@
+2004-03-19 Giovanni Bajo <giovannibajo@gcc.gnu.org>
+
+ PR c++/14545
+ * parser.c (cp_parser_functional_cast): A cast to anything
+ but integral or enumaration type is not an integral constant
+ expression.
+ * pt.c (value_dependent_expression_p): Handle cast expressions
+ without operands (such as "int()").
+
2004-03-18 Mark Mitchell <mark@codesourcery.com>
* semantics.c (finish_pseudo_destructor_expr): Allow differing
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index c05e375..e964f48 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -14494,12 +14494,23 @@ static tree
cp_parser_functional_cast (cp_parser* parser, tree type)
{
tree expression_list;
+ tree cast;
expression_list
= cp_parser_parenthesized_expression_list (parser, false,
/*non_constant_p=*/NULL);
- return build_functional_cast (type, expression_list);
+ cast = build_functional_cast (type, expression_list);
+ /* [expr.const]/1: In an integral constant expression "only type
+ conversions to integral or enumeration type can be used". */
+ if (cast != error_mark_node && !type_dependent_expression_p (type)
+ && !INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (type)))
+ {
+ if (cp_parser_non_integral_constant_expression
+ (parser, "a call to a constructor"))
+ return error_mark_node;
+ }
+ return cast;
}
/* Save the tokens that make up the body of a member function defined
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 365cb18..3719410 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -11776,10 +11776,21 @@ value_dependent_expression_p (tree expression)
|| TREE_CODE (expression) == REINTERPRET_CAST_EXPR
|| TREE_CODE (expression) == CAST_EXPR)
{
- if (dependent_type_p (TREE_TYPE (expression)))
+ tree type = TREE_TYPE (expression);
+ if (dependent_type_p (type))
return true;
/* A functional cast has a list of operands. */
expression = TREE_OPERAND (expression, 0);
+ if (!expression)
+ {
+ /* If there are no operands, it must be an expression such
+ as "int()". This should not happen for aggregate types
+ because it would form non-constant expressions. */
+ my_friendly_assert (INTEGRAL_OR_ENUMERATION_TYPE_P (type),
+ 20040318);
+
+ return false;
+ }
if (TREE_CODE (expression) == TREE_LIST)
{
do
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 391bfa3..7ae25a3 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2004-03-19 Giovanni Bajo <giovannibajo@gcc.gnu.org>
+
+ PR c++/14545
+ * g++.dg/parse/template15.C: New test.
+
2004-03-18 Mark Mitchell <mark@codesourcery.com>
* g++.dg/expr/dtor2.C: New test.
diff --git a/gcc/testsuite/g++.dg/parse/template15.C b/gcc/testsuite/g++.dg/parse/template15.C
new file mode 100644
index 0000000..ce2d130
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/template15.C
@@ -0,0 +1,26 @@
+// { dg-do compile }
+// Contributed by: Peter Schmid
+// <schmid at snake dot iap dot physik dot tu-darmstadt dot de>
+// PR c++/14545: constructor calls are not integer constant expressions
+
+struct A1 { A1(); };
+struct A2 { };
+
+template <class T>
+struct B
+{
+ void foo() {
+ A1();
+ A1 a1 = A1();
+
+ A2();
+ A2 a2 = A2();
+
+ int();
+ int a3 = int();
+ float();
+ float a4 = float();
+ }
+};
+
+template struct B<void>;