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> 2006-10-01 Mark Mitchell <mark@codesourcery.com>
PR c++/29105 PR c++/29105
......
...@@ -1241,38 +1241,39 @@ compparms (tree parms1, tree parms2) ...@@ -1241,38 +1241,39 @@ compparms (tree parms1, tree parms2)
tree tree
cxx_sizeof_or_alignof_type (tree type, enum tree_code op, bool complain) cxx_sizeof_or_alignof_type (tree type, enum tree_code op, bool complain)
{ {
enum tree_code type_code;
tree value; tree value;
const char *op_name;
gcc_assert (op == SIZEOF_EXPR || op == ALIGNOF_EXPR); gcc_assert (op == SIZEOF_EXPR || op == ALIGNOF_EXPR);
if (type == error_mark_node) if (type == error_mark_node)
return error_mark_node; return error_mark_node;
if (dependent_type_p (type)) type = non_reference (type);
if (TREE_CODE (type) == METHOD_TYPE)
{
if (complain && (pedantic || warn_pointer_arith))
pedwarn ("invalid application of %qs to a member function",
operator_name_info[(int) op].name);
value = size_one_node;
}
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); value = build_min (op, size_type_node, type);
TREE_READONLY (value) = 1; TREE_READONLY (value) = 1;
return value; return value;
} }
op_name = operator_name_info[(int) op].name; return c_sizeof_or_alignof_type (complete_type (type),
type = non_reference (type);
type_code = TREE_CODE (type);
if (type_code == METHOD_TYPE)
{
if (complain && (pedantic || warn_pointer_arith))
pedwarn ("invalid application of %qs to a member function", op_name);
value = size_one_node;
}
else
value = c_sizeof_or_alignof_type (complete_type (type),
op == SIZEOF_EXPR, op == SIZEOF_EXPR,
complain); complain);
return value;
} }
/* Process a sizeof expression where the operand is an expression. */ /* 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> 2006-10-02 Francois-Xavier Coudert <coudert@clipper.ens.fr>
PR fortran/29210 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