From 70e9ab23f4ad839bd0979da933101a0da8fbefe9 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Mon, 25 Feb 2013 23:27:40 -0500 Subject: re PR c++/56438 (ICE in value_dependent_expression_p, at cp/pt.c:19551) PR c++/56438 * semantics.c (potential_constant_expression_1): In C++98, a cast to non-integral type can't be a constant expression. From-SVN: r196274 --- gcc/cp/semantics.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'gcc/cp/semantics.c') diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 458ed26..60271b5 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -8607,6 +8607,18 @@ potential_constant_expression_1 (tree t, bool want_rval, tsubst_flags_t flags) case STATIC_CAST_EXPR: case REINTERPRET_CAST_EXPR: case IMPLICIT_CONV_EXPR: + if (cxx_dialect < cxx0x + && !dependent_type_p (TREE_TYPE (t)) + && !INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (t))) + /* In C++98, a conversion to non-integral type can't be part of a + constant expression. */ + { + if (flags & tf_error) + error ("cast to non-integral type %qT in a constant expression", + TREE_TYPE (t)); + return false; + } + return (potential_constant_expression_1 (TREE_OPERAND (t, 0), TREE_CODE (TREE_TYPE (t)) != REFERENCE_TYPE, flags)); -- cgit v1.1