This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[C++ PATCH] Don't ICE if __decltype is called on CALL_EXPR with type dependent CALL_EXPR_FN (PR c++/37540)
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Jason Merrill <jason at redhat dot com>, Mark Mitchell <mark at codesourcery dot com>
- Cc: gcc-patches at gcc dot gnu dot org, Doug Gregor <doug dot gregor at gmail dot com>
- Date: Tue, 21 Oct 2008 18:19:25 +0200
- Subject: [C++ PATCH] Don't ICE if __decltype is called on CALL_EXPR with type dependent CALL_EXPR_FN (PR c++/37540)
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
Hi!
The recently added code to finish_decltype_type looks at CALL_EXPR_FN's
type, but as can be seen on the testcase below, if expr (the CALL_EXPR)
isn't type dependent (result type is known), CALL_EXPR_FN can still
be type dependent, can have NULL result type etc.
This patch handles that case the same as if the whole expr is type
dependent. Alternatively patch could do:
- if (type_dependent_expression_p (expr))
+ if (type_dependent_expression_p (expr)
+ || (TREE_CODE (expr) == CALL_EXPR
+ && type_dependent_expression_p (CALL_EXPR_FN (expr))))
Ok for trunk if bootstrap/regtest passes?
2008-10-21 Jakub Jelinek <jakub@redhat.com>
PR c++/37540
* semantics.c (finish_decltype_type): If CALL_EXPR_FN is
type dependent, do the same as if expr is type dependent.
* g++.dg/cpp0x/decltype13.C: New test.
--- gcc/cp/semantics.c.jj 2008-10-14 10:17:49.000000000 +0200
+++ gcc/cp/semantics.c 2008-10-21 17:58:54.000000000 +0200
@@ -4496,6 +4496,7 @@ finish_decltype_type (tree expr, bool id
if (type_dependent_expression_p (expr))
{
+ is_dependent_expr:
type = cxx_make_type (DECLTYPE_TYPE);
DECLTYPE_TYPE_EXPR (type) = expr;
DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P (type)
@@ -4609,7 +4610,9 @@ finish_decltype_type (tree expr, bool id
tree fndecl = get_callee_fndecl (expr);
if (fndecl && fndecl != error_mark_node)
type = TREE_TYPE (TREE_TYPE (fndecl));
- else
+ else if (type_dependent_expression_p (CALL_EXPR_FN (expr)))
+ goto is_dependent_expr;
+ else
{
tree target_type = TREE_TYPE (CALL_EXPR_FN (expr));
if ((TREE_CODE (target_type) == REFERENCE_TYPE
--- gcc/testsuite/g++.dg/cpp0x/decltype13.C.jj 2008-10-21 18:01:40.000000000 +0200
+++ gcc/testsuite/g++.dg/cpp0x/decltype13.C 2008-10-21 18:00:58.000000000 +0200
@@ -0,0 +1,13 @@
+// PR c++/37540
+// { dg-do compile }
+
+struct A
+{
+ int g () { return 0; }
+};
+
+template <typename T> void
+f (A a)
+{
+ __decltype (a.g ()) i;
+}
Jakub