diff options
author | Giovanni Bajo <giovannibajo@gcc.gnu.org> | 2004-03-19 09:58:50 +0000 |
---|---|---|
committer | Giovanni Bajo <giovannibajo@gcc.gnu.org> | 2004-03-19 09:58:50 +0000 |
commit | d36d56001a298d89b6d69750cb6dfee4653aa2b8 (patch) | |
tree | 2875ba12f6981d9b9cdec73133129e43d4a3728c | |
parent | 26bcf8fc16a06d4fe16ac25ce79739e2e6cb7445 (diff) | |
download | gcc-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/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/cp/parser.c | 13 | ||||
-rw-r--r-- | gcc/cp/pt.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/template15.C | 26 |
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>; |