2011-04-07 Jason Merrill <jason@redhat.com>
+ PR c++/48450
+ * call.c (resolve_args): Take complain.
+ (build_new_function_call, build_operator_new_call): Pass it.
+ (build_op_call, build_new_op, build_new_method_call): Pass it.
+
PR c++/48450
* typeck.c (check_for_casting_away_constness): Take complain.
(build_static_cast_1, build_reinterpret_cast_1): Pass it.
bool, tsubst_flags_t);
static void op_error (enum tree_code, enum tree_code, tree, tree,
tree, bool);
-static VEC(tree,gc) *resolve_args (VEC(tree,gc) *);
static struct z_candidate *build_user_type_conversion_1 (tree, tree, int);
static void print_z_candidate (const char *, struct z_candidate *);
static void print_z_candidates (location_t, struct z_candidate *);
/* Do any initial processing on the arguments to a function call. */
static VEC(tree,gc) *
-resolve_args (VEC(tree,gc) *args)
+resolve_args (VEC(tree,gc) *args, tsubst_flags_t complain)
{
unsigned int ix;
tree arg;
return NULL;
else if (VOID_TYPE_P (TREE_TYPE (arg)))
{
- error ("invalid use of void expression");
+ if (complain & tf_error)
+ error ("invalid use of void expression");
return NULL;
}
else if (invalid_nonstatic_memfn_p (arg, tf_warning_or_error))
if (args != NULL && *args != NULL)
{
- *args = resolve_args (*args);
+ *args = resolve_args (*args, complain);
if (*args == NULL)
return error_mark_node;
}
if (fn)
*fn = NULL_TREE;
VEC_safe_insert (tree, gc, *args, 0, *size);
- *args = resolve_args (*args);
+ *args = resolve_args (*args, tf_warning_or_error);
if (*args == NULL)
return error_mark_node;
if (args != NULL && *args != NULL)
{
- *args = resolve_args (*args);
+ *args = resolve_args (*args, complain);
if (*args == NULL)
return error_mark_node;
}
if (overloaded_p)
*overloaded_p = true;
- if (resolve_args (arglist) == NULL)
+ if (resolve_args (arglist, complain) == NULL)
result = error_mark_node;
else
result = build_over_call (cand, LOOKUP_NORMAL, complain);
/* Process the argument list. */
if (args != NULL && *args != NULL)
{
- *args = resolve_args (*args);
+ *args = resolve_args (*args, complain);
if (*args == NULL)
return error_mark_node;
}
--- /dev/null
+// PR c++/48450
+// { dg-options -std=c++0x }
+
+namespace std {
+ template <class T> T&& declval();
+};
+
+template<class To, class From,
+ class = decltype(static_cast<To>(std::declval<From>()))
+>
+char f(int);
+
+template<class, class>
+char (&f(...))[2];
+
+struct A { virtual ~A() = 0; };
+struct B {};
+struct D : B {};
+
+static_assert(sizeof(f<A, int>(0)) != 1, "Error"); // a
+static_assert(sizeof(f<int*, const void*>(0)) != 1, "Error"); // b
+static_assert(sizeof(f<D*, const B*>(0)) != 1, "Error"); // c
+static_assert(sizeof(f<int B::*, const int D::*>(0)) != 1, "Error"); // d
+static_assert(sizeof(f<B, void>(0)) != 1, "Error"); // e