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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@144083
138bc75d-0d04-0410-961f-
82ee72b054a4
+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
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,
/* 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).
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)))
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,
+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>
--- /dev/null
+// PR c++/34397
+
+template<typename T, int = T()[0]> struct A
+{
+ typedef A<T> B;
+};
--- /dev/null
+// PR c++/34397
+
+template<typename T, int = T()[0]> struct A
+{
+ typedef A<T> B;
+};
+
+A<int> a; // { dg-error "subscripted|template|declaration" }