Hi,

this small error-recovery issue remained in my todo list of 8 regressions: just clear the friendp flag in this case too - like we do a few lines above for virtual declarations - and avoid problems later. Tested x86_64-linux.

Thanks, Paolo.

////////////////

/cp
2018-04-27  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/84691
        * decl.c (grokdeclarator): Clear friendp upon definition in local
        class definition error.

/testsuite
2018-04-27  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/84691
        * g++.dg/cpp0x/friend3.C: New.
Index: cp/decl.c
===================================================================
--- cp/decl.c   (revision 259697)
+++ cp/decl.c   (working copy)
@@ -11298,9 +11298,11 @@ grokdeclarator (const cp_declarator *declarator,
                if (decl_context == NORMAL)
                  error ("friend declaration not in class definition");
                if (current_function_decl && funcdef_flag)
-                 error ("can%'t define friend function %qs in a local "
-                        "class definition",
-                        name);
+                 {
+                   error ("can%'t define friend function %qs in a local "
+                          "class definition", name);
+                   friendp = 0;
+                 }
              }
            else if (ctype && sfk == sfk_conversion)
              {
Index: testsuite/g++.dg/cpp0x/friend3.C
===================================================================
--- testsuite/g++.dg/cpp0x/friend3.C    (nonexistent)
+++ testsuite/g++.dg/cpp0x/friend3.C    (working copy)
@@ -0,0 +1,11 @@
+// PR c++/84691
+// { dg-do compile { target c++11 } }
+
+template<typename>
+struct a {
+  unsigned b = [] {
+    union {
+      friend void c() {}  // { dg-error "local class" }
+    };  // { dg-error "no members" }
+  };
+};

Reply via email to