diff options
author | Paolo Carlini <paolo@gcc.gnu.org> | 2009-02-10 21:47:12 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2009-02-10 21:47:12 +0000 |
commit | 493e377c04278267043c9320532792e1ea40ae14 (patch) | |
tree | a3953b2faec3ebc31a95a4a80f9e1ded516c8a3b | |
parent | 1f542826fd1861c078ed2d06fb53d97453a02900 (diff) | |
download | gcc-493e377c04278267043c9320532792e1ea40ae14.zip gcc-493e377c04278267043c9320532792e1ea40ae14.tar.gz gcc-493e377c04278267043c9320532792e1ea40ae14.tar.bz2 |
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
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 1 | ||||
-rw-r--r-- | gcc/cp/pt.c | 14 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 28 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/crash88.C | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/crash89.C | 8 |
7 files changed, 60 insertions, 12 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2db00fd..5b35437 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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 diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 87eefa3..5bf8595 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -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, diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index c5b675f..3176dc2 100644 --- a/gcc/cp/pt.c +++ b/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))) diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index c58d40b..a6986f9 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -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, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 37654e7..fedb4c6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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> diff --git a/gcc/testsuite/g++.dg/template/crash88.C b/gcc/testsuite/g++.dg/template/crash88.C new file mode 100644 index 0000000..438ab90 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash88.C @@ -0,0 +1,6 @@ +// PR c++/34397 + +template<typename T, int = T()[0]> struct A +{ + typedef A<T> B; +}; diff --git a/gcc/testsuite/g++.dg/template/crash89.C b/gcc/testsuite/g++.dg/template/crash89.C new file mode 100644 index 0000000..e62b57a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash89.C @@ -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" } |