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:
Paolo Carlini 2009-02-10 21:47:12 +00:00
parent 1f542826fd
commit 493e377c04
7 changed files with 60 additions and 12 deletions

View File

@ -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

View File

@ -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,

View File

@ -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)))

View File

@ -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,

View File

@ -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>

View File

@ -0,0 +1,6 @@
// PR c++/34397
template<typename T, int = T()[0]> struct A
{
typedef A<T> B;
};

View 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" }