aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@codesourcery.com>2005-10-12 18:13:41 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2005-10-12 18:13:41 +0000
commitfdeff56396905c2701560ad90f1f1bcdd5c2fd55 (patch)
tree972b3ae09161bee749f644b55853df35eaf2009e
parent3ce5fa4fa606357251b653f66fbef96fdfcbea2f (diff)
downloadgcc-fdeff56396905c2701560ad90f1f1bcdd5c2fd55.zip
gcc-fdeff56396905c2701560ad90f1f1bcdd5c2fd55.tar.gz
gcc-fdeff56396905c2701560ad90f1f1bcdd5c2fd55.tar.bz2
re PR c++/21592 (ICE in resolve_overloaded_unification/arg_assoc)
cp: PR c++/21592 * pt.c (build_non_dependent_expr): Don't wrap a COMPONENT_REF with already looked up member functions. Assert we're not returning a NON_DEPENDENT_EXPR with unknown type. * typeck.c (finish_class_member_access_expr): We can get non-template-id-expr baselinks. If the lookup finds a baselink, remember it even inside templates. testsuite: PR c++/21592 * g++.dg/template/dependent-expr1.C: Add new expected error. * g++.dg/template/dependent-expr2.C: Adjust error text. * g++.dg/template/overload6.C: New. From-SVN: r105313
-rw-r--r--gcc/cp/ChangeLog8
-rw-r--r--gcc/cp/pt.c7
-rw-r--r--gcc/cp/typeck.c11
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/template/dependent-expr1.C2
-rw-r--r--gcc/testsuite/g++.dg/template/dependent-expr2.C2
-rw-r--r--gcc/testsuite/g++.dg/template/overload6.C17
7 files changed, 43 insertions, 9 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index d6dad42..404c7de 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,13 @@
2005-10-12 Nathan Sidwell <nathan@codesourcery.com>
+ PR c++/21592
+ * pt.c (build_non_dependent_expr): Don't wrap a COMPONENT_REF
+ with already looked up member functions. Assert we're not
+ returning a NON_DEPENDENT_EXPR with unknown type.
+ * typeck.c (finish_class_member_access_expr): We can get
+ non-template-id-expr baselinks. If the lookup finds a baselink,
+ remember it even inside templates.
+
PR c++/23797
* parser.c (cp_parser_functional_cast): Cope when TYPE is not a
TYPE_DECL. Use dependent_type_p to check type.
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 020d819..6724cf4 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -12641,7 +12641,9 @@ build_non_dependent_expr (tree expr)
/* Preserve OVERLOADs; the functions must be available to resolve
types. */
inner_expr = (TREE_CODE (expr) == ADDR_EXPR ?
- TREE_OPERAND (expr, 0) : expr);
+ TREE_OPERAND (expr, 0) :
+ TREE_CODE (expr) == COMPONENT_REF ?
+ TREE_OPERAND (expr, 1) : expr);
if (is_overloaded_fn (inner_expr)
|| TREE_CODE (inner_expr) == OFFSET_REF)
return expr;
@@ -12680,6 +12682,9 @@ build_non_dependent_expr (tree expr)
TREE_OPERAND (expr, 0),
build_non_dependent_expr (TREE_OPERAND (expr, 1)));
+ /* If the type is unknown, it can't really be non-dependent */
+ gcc_assert (TREE_TYPE (expr) != unknown_type_node);
+
/* Otherwise, build a NON_DEPENDENT_EXPR.
REFERENCE_TYPEs are not stripped for expressions in templates
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index d8210f1..d39b53ae 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -1904,11 +1904,8 @@ finish_class_member_access_expr (tree object, tree name)
}
if (BASELINK_P (name))
- {
- /* A member function that has already been looked up. */
- gcc_assert (TREE_CODE (BASELINK_FUNCTIONS (name)) == TEMPLATE_ID_EXPR);
- member = name;
- }
+ /* A member function that has already been looked up. */
+ member = name;
else
{
bool is_template_id = false;
@@ -2002,7 +1999,9 @@ finish_class_member_access_expr (tree object, tree name)
/*preserve_reference=*/false);
if (processing_template_decl && expr != error_mark_node)
return build_min_non_dep (COMPONENT_REF, expr,
- orig_object, orig_name, NULL_TREE);
+ orig_object,
+ BASELINK_P (member) ? member : orig_name,
+ NULL_TREE);
return expr;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 1f416b6..9c14e0d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2005-10-12 Nathan Sidwell <nathan@codesourcery.com>
+ PR c++/21592
+ * g++.dg/template/dependent-expr1.C: Add new expected error.
+ * g++.dg/template/dependent-expr2.C: Adjust error text.
+ * g++.dg/template/overload6.C: New.
+
PR c++/23797
* g++.dg/other/typename8.C: New.
diff --git a/gcc/testsuite/g++.dg/template/dependent-expr1.C b/gcc/testsuite/g++.dg/template/dependent-expr1.C
index e29b76d..7964986 100644
--- a/gcc/testsuite/g++.dg/template/dependent-expr1.C
+++ b/gcc/testsuite/g++.dg/template/dependent-expr1.C
@@ -19,7 +19,7 @@ namespace std
Foo (sizeof (x));
Foo (__alignof__ (I));
Foo (__alignof__ (x));
- Foo (x->~I ());
+ Foo (x->~I ()); // { dg-error "" }
// Foo (typeid (I));
Foo (delete x); // { dg-error "" }
Foo (delete[] x); // { dg-error "" }
diff --git a/gcc/testsuite/g++.dg/template/dependent-expr2.C b/gcc/testsuite/g++.dg/template/dependent-expr2.C
index 9c9d5f9..06f056b 100644
--- a/gcc/testsuite/g++.dg/template/dependent-expr2.C
+++ b/gcc/testsuite/g++.dg/template/dependent-expr2.C
@@ -18,6 +18,6 @@ struct B
{
bool bar(A& a)
{
- return a.foo == 0; // { dg-error "insufficient context" "" }
+ return a.foo == 0; // { dg-error "" "" }
}
};
diff --git a/gcc/testsuite/g++.dg/template/overload6.C b/gcc/testsuite/g++.dg/template/overload6.C
new file mode 100644
index 0000000..478b466
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/overload6.C
@@ -0,0 +1,17 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 12 Oct 2005 <nathan@codesourcery.com>
+
+// PR 21592:ICE
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+template<typename T> void unique(T,T);
+
+struct A
+{
+ int begin();
+};
+
+template<int> void foo()
+{
+ unique(A().begin); // { dg-error "no matching function" "" }
+}