This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[C++ PATCH] Don't ICE if __decltype is called on CALL_EXPR with type dependent CALL_EXPR_FN (PR c++/37540)


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]