Commit 3c17e16e by Mark Mitchell Committed by Mark Mitchell

re PR c++/29226 (ICE in make_decl_rtl, at varasm.c:886)

	PR c++/29226
	* typeck.c (cxx_sizeof_or_alignof_type): Tidy.  In templates, do
	not try to actually evaluate sizeof for a VLA type.
	PR c++/29226
	* g++.dg/template/vla1.C: New test.

From-SVN: r117375
parent 1c846af9
2006-10-02 Mark Mitchell <mark@codesourcery.com>
PR c++/29226
* typeck.c (cxx_sizeof_or_alignof_type): Tidy. In templates, do
not try to actually evaluate sizeof for a VLA type.
2006-10-01 Mark Mitchell <mark@codesourcery.com>
PR c++/29105
......
......@@ -1241,38 +1241,39 @@ compparms (tree parms1, tree parms2)
tree
cxx_sizeof_or_alignof_type (tree type, enum tree_code op, bool complain)
{
enum tree_code type_code;
tree value;
const char *op_name;
gcc_assert (op == SIZEOF_EXPR || op == ALIGNOF_EXPR);
if (type == error_mark_node)
return error_mark_node;
if (dependent_type_p (type))
{
value = build_min (op, size_type_node, type);
TREE_READONLY (value) = 1;
return value;
}
op_name = operator_name_info[(int) op].name;
type = non_reference (type);
type_code = TREE_CODE (type);
if (type_code == METHOD_TYPE)
if (TREE_CODE (type) == METHOD_TYPE)
{
if (complain && (pedantic || warn_pointer_arith))
pedwarn ("invalid application of %qs to a member function", op_name);
pedwarn ("invalid application of %qs to a member function",
operator_name_info[(int) op].name);
value = size_one_node;
}
else
value = c_sizeof_or_alignof_type (complete_type (type),
op == SIZEOF_EXPR,
complain);
return value;
if (dependent_type_p (type)
/* VLA types will have a non-constant size. In the body of an
uninstantiated template, we don't need to try to compute the
value, because the sizeof expression is not an integral
constant expression in that case. And, if we do try to
compute the value, we'll likely end up with SAVE_EXPRs, which
the template substitution machinery does not expect to see. */
|| (processing_template_decl &&
TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST))
{
value = build_min (op, size_type_node, type);
TREE_READONLY (value) = 1;
return value;
}
return c_sizeof_or_alignof_type (complete_type (type),
op == SIZEOF_EXPR,
complain);
}
/* Process a sizeof expression where the operand is an expression. */
......
2006-10-02 Mark Mitchell <mark@codesourcery.com>
PR c++/29226
* g++.dg/template/vla1.C: New test.
2006-10-02 Francois-Xavier Coudert <coudert@clipper.ens.fr>
PR fortran/29210
// PR c++/29226
// { dg-options "" }
template <bool>
static int label (int w)
{
sizeof(int[w]);
}
int a = label<false>(1);
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