+2013-02-09 Jason Merrill <jason@redhat.com>
+
+ PR c++/56238
+ * pt.c (build_non_dependent_expr): Don't try to fold
+ instantiation-dependent expressions.
+ (instantiation_dependent_r) [TRAIT_EXPR]: Split out.
+ [BIND_EXPR]: Treat as dependent.
+
2013-02-07 Jakub Jelinek <jakub@redhat.com>
PR c++/56241
case ALIGNOF_EXPR:
case TYPEID_EXPR:
case AT_ENCODE_EXPR:
- case TRAIT_EXPR:
{
tree op = TREE_OPERAND (*tp, 0);
if (code == SIZEOF_EXPR && SIZEOF_EXPR_TYPE_P (*tp))
op = TREE_TYPE (op);
if (TYPE_P (op))
{
- if (dependent_type_p (op)
- || (code == TRAIT_EXPR
- && dependent_type_p (TREE_OPERAND (*tp, 1))))
+ if (dependent_type_p (op))
return *tp;
else
{
break;
}
+ case TRAIT_EXPR:
+ if (dependent_type_p (TRAIT_EXPR_TYPE1 (*tp))
+ || dependent_type_p (TRAIT_EXPR_TYPE2 (*tp)))
+ return *tp;
+ *walk_subtrees = false;
+ return NULL_TREE;
+
case COMPONENT_REF:
if (TREE_CODE (TREE_OPERAND (*tp, 1)) == IDENTIFIER_NODE)
/* In a template, finish_class_member_access_expr creates a
else
break;
+ /* Treat statement-expressions as dependent. */
+ case BIND_EXPR:
+ return *tp;
+
default:
break;
}
tree inner_expr;
#ifdef ENABLE_CHECKING
- /* Try to get a constant value for all non-type-dependent expressions in
+ /* Try to get a constant value for all non-dependent expressions in
order to expose bugs in *_dependent_expression_p and constexpr. */
- if (cxx_dialect >= cxx0x)
+ if (cxx_dialect >= cxx0x
+ && !instantiation_dependent_expression_p (expr))
maybe_constant_value (fold_non_dependent_expr_sfinae (expr, tf_none));
#endif
--- /dev/null
+// PR c++/56238
+
+class A
+{
+ template < typename T > T& get ();
+ template < typename T > class B
+ {
+ void RemovePoint (A& value)
+ {
+ static_cast < double >(value.get < T > ());
+ }
+ };
+};