mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-06 02:20:34 +08:00
re PR c++/34397 (ICE on invalid default template parameter)
/cp 2009-02-10 Paolo Carlini <paolo.carlini@oracle.com> PR c++/34397 * typeck.c (build_x_array_ref): New. * cp-tree.h: Declare it. * pt.c (tsubst_copy_and_build): Use it for case ARRAY_REF. /testsuite 2009-02-10 Paolo Carlini <paolo.carlini@oracle.com> PR c++/34397 * g++.dg/template/crash88.C: New. * g++.dg/template/crash89.C: Likewise. From-SVN: r144083
This commit is contained in:
parent
1f542826fd
commit
493e377c04
@ -1,3 +1,10 @@
|
||||
2009-02-10 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
|
||||
PR c++/34397
|
||||
* typeck.c (build_x_array_ref): New.
|
||||
* cp-tree.h: Declare it.
|
||||
* pt.c (tsubst_copy_and_build): Use it for case ARRAY_REF.
|
||||
|
||||
2009-02-09 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/39109
|
||||
|
@ -4937,6 +4937,7 @@ extern tree build_x_binary_op (enum tree_code, tree,
|
||||
enum tree_code, tree,
|
||||
enum tree_code, bool *,
|
||||
tsubst_flags_t);
|
||||
extern tree build_x_array_ref (tree, tree, tsubst_flags_t);
|
||||
extern tree build_x_unary_op (enum tree_code, tree,
|
||||
tsubst_flags_t);
|
||||
extern tree cp_build_unary_op (enum tree_code, tree, int,
|
||||
|
14
gcc/cp/pt.c
14
gcc/cp/pt.c
@ -1,6 +1,7 @@
|
||||
/* Handle parameterized types (templates) for GNU C++.
|
||||
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
|
||||
2001, 2002, 2003, 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
|
||||
2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009
|
||||
Free Software Foundation, Inc.
|
||||
Written by Ken Raeburn (raeburn@cygnus.com) while at Watchmaker Computing.
|
||||
Rewritten by Jason Merrill (jason@cygnus.com).
|
||||
|
||||
@ -11228,16 +11229,7 @@ tsubst_copy_and_build (tree t,
|
||||
case ARRAY_REF:
|
||||
op1 = tsubst_non_call_postfix_expression (TREE_OPERAND (t, 0),
|
||||
args, complain, in_decl);
|
||||
return build_x_binary_op (ARRAY_REF, op1,
|
||||
(TREE_NO_WARNING (TREE_OPERAND (t, 0))
|
||||
? ERROR_MARK
|
||||
: TREE_CODE (TREE_OPERAND (t, 0))),
|
||||
RECUR (TREE_OPERAND (t, 1)),
|
||||
(TREE_NO_WARNING (TREE_OPERAND (t, 1))
|
||||
? ERROR_MARK
|
||||
: TREE_CODE (TREE_OPERAND (t, 1))),
|
||||
/*overloaded_p=*/NULL,
|
||||
complain);
|
||||
return build_x_array_ref (op1, RECUR (TREE_OPERAND (t, 1)), complain);
|
||||
|
||||
case SIZEOF_EXPR:
|
||||
if (PACK_EXPANSION_P (TREE_OPERAND (t, 0)))
|
||||
|
@ -3198,6 +3198,34 @@ build_x_binary_op (enum tree_code code, tree arg1, enum tree_code arg1_code,
|
||||
return expr;
|
||||
}
|
||||
|
||||
/* Build and return an ARRAY_REF expression. */
|
||||
|
||||
tree
|
||||
build_x_array_ref (tree arg1, tree arg2, tsubst_flags_t complain)
|
||||
{
|
||||
tree orig_arg1 = arg1;
|
||||
tree orig_arg2 = arg2;
|
||||
tree expr;
|
||||
|
||||
if (processing_template_decl)
|
||||
{
|
||||
if (type_dependent_expression_p (arg1)
|
||||
|| type_dependent_expression_p (arg2))
|
||||
return build_min_nt (ARRAY_REF, arg1, arg2,
|
||||
NULL_TREE, NULL_TREE);
|
||||
arg1 = build_non_dependent_expr (arg1);
|
||||
arg2 = build_non_dependent_expr (arg2);
|
||||
}
|
||||
|
||||
expr = build_new_op (ARRAY_REF, LOOKUP_NORMAL, arg1, arg2, NULL_TREE,
|
||||
/*overloaded_p=*/NULL, complain);
|
||||
|
||||
if (processing_template_decl && expr != error_mark_node)
|
||||
return build_min_non_dep (ARRAY_REF, expr, orig_arg1, orig_arg2,
|
||||
NULL_TREE, NULL_TREE);
|
||||
return expr;
|
||||
}
|
||||
|
||||
/* For the c-common bits. */
|
||||
tree
|
||||
build_binary_op (location_t location, enum tree_code code, tree op0, tree op1,
|
||||
|
@ -1,7 +1,13 @@
|
||||
2009-02-10 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
|
||||
PR c++/34397
|
||||
* g++.dg/template/crash88.C: New.
|
||||
* g++.dg/template/crash89.C: Likewise.
|
||||
|
||||
2009-02-10 Steve Ellcey <sje@cup.hp.com>
|
||||
|
||||
PR c/39084
|
||||
gcc.dg/pr39084.c: New test.
|
||||
* gcc.dg/pr39084.c: New test.
|
||||
|
||||
2009-02-10 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
|
6
gcc/testsuite/g++.dg/template/crash88.C
Normal file
6
gcc/testsuite/g++.dg/template/crash88.C
Normal file
@ -0,0 +1,6 @@
|
||||
// PR c++/34397
|
||||
|
||||
template<typename T, int = T()[0]> struct A
|
||||
{
|
||||
typedef A<T> B;
|
||||
};
|
8
gcc/testsuite/g++.dg/template/crash89.C
Normal file
8
gcc/testsuite/g++.dg/template/crash89.C
Normal file
@ -0,0 +1,8 @@
|
||||
// PR c++/34397
|
||||
|
||||
template<typename T, int = T()[0]> struct A
|
||||
{
|
||||
typedef A<T> B;
|
||||
};
|
||||
|
||||
A<int> a; // { dg-error "subscripted|template|declaration" }
|
Loading…
x
Reference in New Issue
Block a user