Hi,

On 19/05/2016 15:58, Jason Merrill wrote:
On 05/18/2016 07:13 PM, Paolo Carlini wrote:
+      error ("cannot declare variable %q+D with function type", decl);

I think the error message would be more helpful if it mentioned decltype(auto), maybe

"initializer for %<decltype(auto) %D%> has function type, did you forget the %<()%>?", DECL_NAME (decl)

(or some other way to print the variable type as declared rather than as deduced).

The below passes testing. There are a few minor changes wrt your suggestions (I think we want & as hint; spacing consistent with typeck2.c; DECL_NAME doesn't seem necessary). I wondered if we want to tighten the condition consistently with the wording of the error message, thus patchlet *2 below, which of course also passes testing.

Thanks,
Paolo.

///////////////////////
Index: cp/decl.c
===================================================================
--- cp/decl.c   (revision 236496)
+++ cp/decl.c   (working copy)
@@ -6609,6 +6609,13 @@ cp_finish_decl (tree decl, tree init, bool init_co
                                                    adc_variable_type);
       if (type == error_mark_node)
        return;
+      if (TREE_CODE (type) == FUNCTION_TYPE)
+       {
+         error ("initializer for %<decltype(auto) %D%> has function type "
+                "(did you forget the %<&%> ?)", decl);
+         TREE_TYPE (decl) = error_mark_node;
+         return;
+       }
       cp_apply_type_quals_to_decl (cp_type_quals (type), decl);
     }
 
Index: testsuite/g++.dg/cpp1y/auto-fn31.C
===================================================================
--- testsuite/g++.dg/cpp1y/auto-fn31.C  (revision 0)
+++ testsuite/g++.dg/cpp1y/auto-fn31.C  (working copy)
@@ -0,0 +1,7 @@
+// PR c++/70572
+// { dg-do compile { target c++14 } }
+
+void foo ()
+{
+  decltype (auto) a = foo;  // { dg-error "initializer" }
+}
Index: cp/decl.c
===================================================================
--- cp/decl.c   (revision 236496)
+++ cp/decl.c   (working copy)
@@ -6609,6 +6609,14 @@ cp_finish_decl (tree decl, tree init, bool init_co
                                                    adc_variable_type);
       if (type == error_mark_node)
        return;
+      if (TREE_CODE (type) == FUNCTION_TYPE
+         && TREE_CODE (TREE_TYPE (d_init)) == FUNCTION_TYPE)
+       {
+         error ("initializer for %<decltype(auto) %D%> has function type "
+                "(did you forget the %<&%> ?)", decl);
+         TREE_TYPE (decl) = error_mark_node;
+         return;
+       }
       cp_apply_type_quals_to_decl (cp_type_quals (type), decl);
     }
 
Index: testsuite/g++.dg/cpp1y/auto-fn31.C
===================================================================
--- testsuite/g++.dg/cpp1y/auto-fn31.C  (revision 0)
+++ testsuite/g++.dg/cpp1y/auto-fn31.C  (working copy)
@@ -0,0 +1,7 @@
+// PR c++/70572
+// { dg-do compile { target c++14 } }
+
+void foo ()
+{
+  decltype (auto) a = foo;  // { dg-error "initializer" }
+}

Reply via email to