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
This commit is contained in:
Mark Mitchell 2006-10-02 22:21:02 +00:00 committed by Mark Mitchell
parent 1c846af9c5
commit 3c17e16e31
4 changed files with 41 additions and 20 deletions

View File

@ -1,3 +1,9 @@
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

View File

@ -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))
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);
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 (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,
complain);
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. */

View File

@ -1,3 +1,8 @@
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

View File

@ -0,0 +1,9 @@
// PR c++/29226
// { dg-options "" }
template <bool>
static int label (int w)
{
sizeof(int[w]);
}
int a = label<false>(1);