* cp-tree.h: Add it to prototype.
* call.c (build_new_op): Pass it.
* class.c (build_vtbl_ref): Pass it.
* decl2.c (grok_array_decl): Pass it.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@159351
138bc75d-0d04-0410-961f-
82ee72b054a4
2010-05-12 Jason Merrill <jason@redhat.com>
2010-05-12 Jason Merrill <jason@redhat.com>
+ * typeck.c (build_array_ref): Take complain parm.
+ * cp-tree.h: Add it to prototype.
+ * call.c (build_new_op): Pass it.
+ * class.c (build_vtbl_ref): Pass it.
+ * decl2.c (grok_array_decl): Pass it.
+
PR bootstrap/44048
PR target/44099
* cp-tree.def (NULLPTR_TYPE): Remove.
PR bootstrap/44048
PR target/44099
* cp-tree.def (NULLPTR_TYPE): Remove.
return cp_build_unary_op (code, arg1, candidates != 0, complain);
case ARRAY_REF:
return cp_build_unary_op (code, arg1, candidates != 0, complain);
case ARRAY_REF:
- return build_array_ref (input_location, arg1, arg2);
+ return build_array_ref (input_location, arg1, arg2, complain);
case MEMBER_REF:
return build_m_component_ref (cp_build_indirect_ref (arg1, RO_NULL,
case MEMBER_REF:
return build_m_component_ref (cp_build_indirect_ref (arg1, RO_NULL,
if (!vtbl)
vtbl = build_vfield_ref (instance, basetype);
if (!vtbl)
vtbl = build_vfield_ref (instance, basetype);
- aref = build_array_ref (input_location, vtbl, idx);
+ aref = build_array_ref (input_location, vtbl, idx, tf_warning_or_error);
TREE_CONSTANT (aref) |= TREE_CONSTANT (vtbl) && TREE_CONSTANT (idx);
return aref;
TREE_CONSTANT (aref) |= TREE_CONSTANT (vtbl) && TREE_CONSTANT (idx);
return aref;
tsubst_flags_t);
extern tree cp_build_indirect_ref (tree, ref_operator,
tsubst_flags_t);
tsubst_flags_t);
extern tree cp_build_indirect_ref (tree, ref_operator,
tsubst_flags_t);
-extern tree build_array_ref (location_t, tree, tree);
+extern tree build_array_ref (location_t, tree, tree,
+ tsubst_flags_t);
extern tree get_member_function_from_ptrfunc (tree *, tree);
extern tree cp_build_function_call (tree, tree, tsubst_flags_t);
extern tree cp_build_function_call_vec (tree, VEC(tree,gc) **,
extern tree get_member_function_from_ptrfunc (tree *, tree);
extern tree cp_build_function_call (tree, tree, tsubst_flags_t);
extern tree cp_build_function_call_vec (tree, VEC(tree,gc) **,
if (array_expr == error_mark_node || index_exp == error_mark_node)
error ("ambiguous conversion for array subscript");
if (array_expr == error_mark_node || index_exp == error_mark_node)
error ("ambiguous conversion for array subscript");
- expr = build_array_ref (input_location, array_expr, index_exp);
+ expr = build_array_ref (input_location, array_expr, index_exp,
+ tf_warning_or_error);
}
if (processing_template_decl && expr != error_mark_node)
return build_min_non_dep (ARRAY_REF, expr, orig_array_expr, orig_index_exp,
}
if (processing_template_decl && expr != error_mark_node)
return build_min_non_dep (ARRAY_REF, expr, orig_array_expr, orig_index_exp,
LOC is the location to use in building the array reference. */
tree
LOC is the location to use in building the array reference. */
tree
-build_array_ref (location_t loc, tree array, tree idx)
+build_array_ref (location_t loc, tree array, tree idx,
+ tsubst_flags_t complain)
{
tree ret;
if (idx == 0)
{
{
tree ret;
if (idx == 0)
{
- error_at (loc, "subscript missing in array reference");
+ if (complain & tf_error)
+ error_at (loc, "subscript missing in array reference");
return error_mark_node;
}
return error_mark_node;
}
- tree value = build_array_ref (loc, TREE_OPERAND (array, 1), idx);
+ tree value = build_array_ref (loc, TREE_OPERAND (array, 1), idx,
+ complain);
ret = build2 (COMPOUND_EXPR, TREE_TYPE (value),
TREE_OPERAND (array, 0), value);
SET_EXPR_LOCATION (ret, loc);
ret = build2 (COMPOUND_EXPR, TREE_TYPE (value),
TREE_OPERAND (array, 0), value);
SET_EXPR_LOCATION (ret, loc);
case COND_EXPR:
ret = build_conditional_expr
(TREE_OPERAND (array, 0),
case COND_EXPR:
ret = build_conditional_expr
(TREE_OPERAND (array, 0),
- build_array_ref (loc, TREE_OPERAND (array, 1), idx),
- build_array_ref (loc, TREE_OPERAND (array, 2), idx),
+ build_array_ref (loc, TREE_OPERAND (array, 1), idx, complain),
+ build_array_ref (loc, TREE_OPERAND (array, 2), idx, complain),
tf_warning_or_error);
protected_set_expr_location (ret, loc);
return ret;
tf_warning_or_error);
protected_set_expr_location (ret, loc);
return ret;
if (!INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (TREE_TYPE (idx)))
{
if (!INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (TREE_TYPE (idx)))
{
- error_at (loc, "array subscript is not an integer");
+ if (complain & tf_error)
+ error_at (loc, "array subscript is not an integer");
return error_mark_node;
}
return error_mark_node;
}
return error_mark_node;
}
return error_mark_node;
}
+ if (!lvalue_p (array) && (complain & tf_error))
pedwarn (loc, OPT_pedantic,
"ISO C++ forbids subscripting non-lvalue array");
pedwarn (loc, OPT_pedantic,
"ISO C++ forbids subscripting non-lvalue array");
tree foo = array;
while (TREE_CODE (foo) == COMPONENT_REF)
foo = TREE_OPERAND (foo, 0);
tree foo = array;
while (TREE_CODE (foo) == COMPONENT_REF)
foo = TREE_OPERAND (foo, 0);
- if (TREE_CODE (foo) == VAR_DECL && DECL_REGISTER (foo))
+ if (TREE_CODE (foo) == VAR_DECL && DECL_REGISTER (foo)
+ && (complain & tf_warning))
warning_at (loc, OPT_Wextra,
"subscripting array declared %<register%>");
}
warning_at (loc, OPT_Wextra,
"subscripting array declared %<register%>");
}
if (TREE_CODE (TREE_TYPE (ar)) != POINTER_TYPE)
{
if (TREE_CODE (TREE_TYPE (ar)) != POINTER_TYPE)
{
- error_at (loc, "subscripted value is neither array nor pointer");
+ if (complain & tf_error)
+ error_at (loc, "subscripted value is neither array nor pointer");
return error_mark_node;
}
if (TREE_CODE (TREE_TYPE (ind)) != INTEGER_TYPE)
{
return error_mark_node;
}
if (TREE_CODE (TREE_TYPE (ind)) != INTEGER_TYPE)
{
- error_at (loc, "array subscript is not an integer");
+ if (complain & tf_error)
+ error_at (loc, "array subscript is not an integer");
return error_mark_node;
}
return error_mark_node;
}
ret = cp_build_indirect_ref (cp_build_binary_op (input_location,
PLUS_EXPR, ar, ind,
ret = cp_build_indirect_ref (cp_build_binary_op (input_location,
PLUS_EXPR, ar, ind,
protected_set_expr_location (ret, loc);
return ret;
}
protected_set_expr_location (ret, loc);
return ret;
}
+2010-05-12 Jason Merrill <jason@redhat.com>
+
+ * g++.dg/cpp0x/sfinae1.C: New.
+
2010-05-12 Sriraman Tallam <tmsriram@google.com>
* gcc.target/i386/zee.c: New file.
2010-05-12 Sriraman Tallam <tmsriram@google.com>
* gcc.target/i386/zee.c: New file.