Commit 70e9ab23 by Jason Merrill Committed by Jason Merrill

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
parent d2b512dc
2013-02-25 Jason Merrill <jason@redhat.com>
PR c++/56438
* semantics.c (potential_constant_expression_1): In C++98, a cast
to non-integral type can't be a constant expression.
2013-02-24 Jakub Jelinek <jakub@redhat.com>
PR c++/56403
......
......@@ -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));
......
// PR c++/56438
struct A { };
A& operator<<(A&, const char*);
struct B {
int size();
};
struct C { };
template <class S, class T>
S bar(const S& s, const T& t) {
return s;
}
template<class S, class T>
void foo() {
A a;
B b;
a << bar(b.size(), C()); // { dg-error "no match" }
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment