@@ -9971,6 +9971,12 @@ grokdeclarator (const cp_declarator *dec
}
else if (decl_context == FIELD)
{
+ if (!staticp && type_uses_auto (type))
+ {
+ error ("non-static data member declared %<auto%>");
+ type = error_mark_node;
+ }
+
/* The C99 flexible array extension. */
if (!staticp && TREE_CODE (type) == ARRAY_TYPE
&& TYPE_DOMAIN (type) == NULL_TREE)
@@ -9,5 +9,5 @@ template<int> struct A
{
static auto k = 7; // { dg-error "non-const" }
static auto l; // { dg-error "has no initializer" }
- auto m; // { dg-error "has no initializer" }
+ auto m; // { dg-error "non-static data member declared" }
};
@@ -0,0 +1,25 @@
+// PR c++/51401
+// { dg-do compile }
+// { dg-options "-std=c++11" }
+
+template <int>
+struct A
+{
+ auto i; // { dg-error "non-static data member declared" }
+};
+
+template <int>
+struct B
+{
+ auto i = 0; // { dg-error "non-static data member declared" }
+};
+
+struct C
+{
+ auto i; // { dg-error "non-static data member declared" }
+};
+
+struct D
+{
+ auto i = 0; // { dg-error "non-static data member declared" }
+};