re PR c++/58561 ([c++11] ICE using declaration of function with auto in return type)
authorPaolo Carlini <paolo.carlini@oracle.com>
Wed, 29 Jan 2014 20:54:09 +0000 (20:54 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Wed, 29 Jan 2014 20:54:09 +0000 (20:54 +0000)
2014-01-29  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/58561
* dwarf2out.c (is_cxx_auto): New.
(is_base_type): Use it.
(gen_type_die_with_usage): Likewise.

/testsuite
2014-01-29  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/58561
* g++.dg/cpp1y/auto-fn23.C: New.

From-SVN: r207282

gcc/ChangeLog
gcc/dwarf2out.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp1y/auto-fn23.C [new file with mode: 0644]

index d5f662b..71fd8e6 100644 (file)
@@ -1,3 +1,10 @@
+2014-01-29  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/58561
+       * dwarf2out.c (is_cxx_auto): New.
+       (is_base_type): Use it.
+       (gen_type_die_with_usage): Likewise.
+
 2014-01-29  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
 
        * config/rs6000/rs6000.c (altivec_expand_vec_perm_const):  Use
index f6efd1f..d1ca4ba 100644 (file)
@@ -10219,6 +10219,23 @@ base_type_die (tree type)
   return base_type_result;
 }
 
+/* A C++ function with deduced return type can have a TEMPLATE_TYPE_PARM
+   named 'auto' in its type: return true for it, false otherwise.  */
+
+static inline bool
+is_cxx_auto (tree type)
+{
+  if (is_cxx ())
+    {
+      tree name = TYPE_NAME (type);
+      if (TREE_CODE (name) == TYPE_DECL)
+       name = DECL_NAME (name);
+      if (name == get_identifier ("auto"))
+       return true;
+    }
+  return false;
+}
+
 /* Given a pointer to an arbitrary ..._TYPE tree node, return nonzero if the
    given input type is a Dwarf "fundamental" type.  Otherwise return null.  */
 
@@ -10252,6 +10269,8 @@ is_base_type (tree type)
       return 0;
 
     default:
+      if (is_cxx_auto (type))
+       return 0;
       gcc_unreachable ();
     }
 
@@ -19830,24 +19849,16 @@ gen_type_die_with_usage (tree type, dw_die_ref context_die,
       break;
 
     default:
-      // A C++ function with deduced return type can have
-      // a TEMPLATE_TYPE_PARM named 'auto' in its type.
-      if (is_cxx ())
+      if (is_cxx_auto (type))
        {
-         tree name = TYPE_NAME (type);
-         if (TREE_CODE (name) == TYPE_DECL)
-           name = DECL_NAME (name);
-         if (name == get_identifier ("auto"))
+         if (!auto_die)
            {
-             if (!auto_die)
-               {
-                 auto_die = new_die (DW_TAG_unspecified_type,
-                                     comp_unit_die (), NULL_TREE);
-                 add_name_attribute (auto_die, "auto");
-               }
-             equate_type_number_to_die (type, auto_die);
-             break;
+             auto_die = new_die (DW_TAG_unspecified_type,
+                                 comp_unit_die (), NULL_TREE);
+             add_name_attribute (auto_die, "auto");
            }
+         equate_type_number_to_die (type, auto_die);
+         break;
        }
       gcc_unreachable ();
     }
index e108609..62bcc31 100644 (file)
@@ -1,5 +1,10 @@
 2014-01-29  Paolo Carlini  <paolo.carlini@oracle.com>
 
+       PR c++/58561
+       * g++.dg/cpp1y/auto-fn23.C: New.
+
+2014-01-29  Paolo Carlini  <paolo.carlini@oracle.com>
+
        PR c++/58846
        * g++.dg/init/dso_handle2.C: New.
 
diff --git a/gcc/testsuite/g++.dg/cpp1y/auto-fn23.C b/gcc/testsuite/g++.dg/cpp1y/auto-fn23.C
new file mode 100644 (file)
index 0000000..57503d7
--- /dev/null
@@ -0,0 +1,9 @@
+// PR c++/58561
+// { dg-options "-std=c++1y -g" }
+
+auto foo();
+
+namespace N
+{
+  using ::foo;
+}