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:
parent
1c846af9c5
commit
3c17e16e31
4 changed files with 41 additions and 20 deletions
|
@ -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
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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
|
||||
|
|
9
gcc/testsuite/g++.dg/template/vla1.C
Normal file
9
gcc/testsuite/g++.dg/template/vla1.C
Normal 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);
|
Loading…
Add table
Reference in a new issue