revert: [multiple changes]
authorPaolo Carlini <paolo.carlini@oracle.com>
Thu, 19 Jul 2018 16:58:06 +0000 (16:58 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Thu, 19 Jul 2018 16:58:06 +0000 (16:58 +0000)
2018-07-19  Paolo Carlini  <paolo.carlini@oracle.com>

Revert fix for c++/59480 (and testsuite followup)

/testsuite
2018-07-19  Paolo Carlini  <paolo.carlini@oracle.com>

* g++.old-deja/g++.mike/p784.C: Add -fpermissive.

/cp
2019-07-18  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/59480, DR 136
* decl.c (check_no_redeclaration_friend_default_args): New.
(duplicate_decls): Use the latter; also check that a friend
declaration specifying default arguments is a definition.

/testsuite
2019-07-18  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/59480, DR 136
* g++.dg/other/friend8.C: New.
* g++.dg/other/friend9.C: Likewise.
* g++.dg/other/friend10.C: Likewise.
* g++.dg/other/friend11.C: Likewise.
* g++.dg/other/friend12.C: Likewise.
* g++.dg/parse/defarg4.C: Compile with -fpermissive -w.
* g++.dg/parse/defarg8.C: Likewise.

From-SVN: r262883

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/other/friend10.C [deleted file]
gcc/testsuite/g++.dg/other/friend11.C [deleted file]
gcc/testsuite/g++.dg/other/friend12.C [deleted file]
gcc/testsuite/g++.dg/other/friend8.C [deleted file]
gcc/testsuite/g++.dg/other/friend9.C [deleted file]
gcc/testsuite/g++.dg/parse/defarg4.C
gcc/testsuite/g++.dg/parse/defarg8.C
gcc/testsuite/g++.old-deja/g++.mike/p784.C

index 4a28c839ef3ff7b08c76100a1e806f4cc8c93f42..125f169c16723f5b721392d24feb9257d5b416b0 100644 (file)
@@ -1,3 +1,14 @@
+2018-07-19  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       Revert fix for c++/59480 (and testsuite followup)
+
+       2019-07-18  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/59480, DR 136
+       * decl.c (check_no_redeclaration_friend_default_args): New.
+       (duplicate_decls): Use the latter; also check that a friend
+       declaration specifying default arguments is a definition.
+
 2018-07-18  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/86550
index 5239ffd5a076d30210e3a25373ca3c10bad47da3..3c1e2ef36984129e2fa2d561908bbe3113f7d6e5 100644 (file)
@@ -1280,39 +1280,6 @@ check_redeclaration_no_default_args (tree decl)
       }
 }
 
-/* NEWDECL is a redeclaration of a function or function template OLDDECL.
-   If either the declaration or the redeclaration is a friend declaration
-   and specifies default arguments issue a diagnostic.   Note: this is to
-   enforce C++17 11.3.6/4: "If a friend declaration specifies a default
-   argument expression, that declaration... shall be the only declaration
-   of the function or function template in the translation unit."  */
-
-static void
-check_no_redeclaration_friend_default_args (tree olddecl, tree newdecl)
-{
-  bool olddecl_friend_p = DECL_FRIEND_P (STRIP_TEMPLATE (olddecl));
-  bool newdecl_friend_p = DECL_FRIEND_P (STRIP_TEMPLATE (newdecl));
-
-  if (!olddecl_friend_p && !newdecl_friend_p)
-    return;
-
-  tree t1 = FUNCTION_FIRST_USER_PARMTYPE (olddecl);
-  tree t2 = FUNCTION_FIRST_USER_PARMTYPE (newdecl);
-
-  for (; t1 && t1 != void_list_node;
-       t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2))
-    if ((olddecl_friend_p && TREE_PURPOSE (t1))
-       || (newdecl_friend_p && TREE_PURPOSE (t2)))
-      {
-       if (permerror (DECL_SOURCE_LOCATION (newdecl),
-                      "friend declaration of %q#D specifies default "
-                      "arguments and isn't the only declaration", newdecl))
-         inform (DECL_SOURCE_LOCATION (olddecl),
-                 "previous declaration of %q#D", olddecl);
-       return;
-      }
-}
-
 /* Merge tree bits that correspond to attributes noreturn, nothrow,
    const,  malloc, and pure from NEWDECL with those of OLDDECL.  */
 
@@ -1909,12 +1876,6 @@ next_arg:;
                                olddecl);
                      }
                  }
-
-             /* C++17 11.3.6/4: "If a friend declaration specifies a default
-                argument expression, that declaration... shall be the only
-                declaration of the function or function template in the
-                translation unit."  */
-             check_no_redeclaration_friend_default_args (olddecl, newdecl);
            }
        }
     }
@@ -2047,18 +2008,11 @@ next_arg:;
 
       if (DECL_FUNCTION_TEMPLATE_P (newdecl))
        {
+         /* Per C++11 8.3.6/4, default arguments cannot be added in later
+            declarations of a function template.  */
          if (DECL_SOURCE_LOCATION (newdecl)
              != DECL_SOURCE_LOCATION (olddecl))
-           {
-             /* Per C++11 8.3.6/4, default arguments cannot be added in
-                later declarations of a function template.  */
-             check_redeclaration_no_default_args (newdecl);
-             /* C++17 11.3.6/4: "If a friend declaration specifies a default
-                argument expression, that declaration... shall be the only
-                declaration of the function or function template in the
-                translation unit."  */
-             check_no_redeclaration_friend_default_args (olddecl, newdecl);
-           }
+           check_redeclaration_no_default_args (newdecl);
 
          check_default_args (newdecl);
 
@@ -8809,21 +8763,6 @@ grokfndecl (tree ctype,
        }
     }
 
-  /* C++17 11.3.6/4: "If a friend declaration specifies a default argument
-     expression, that declaration shall be a definition..."  */
-  if (friendp && !funcdef_flag)
-    {
-      for (tree t = FUNCTION_FIRST_USER_PARMTYPE (decl);
-          t && t != void_list_node; t = TREE_CHAIN (t))
-       if (TREE_PURPOSE (t))
-         {
-           permerror (DECL_SOURCE_LOCATION (decl),
-                      "friend declaration of %qD specifies default "
-                      "arguments and isn't a definition", decl);
-           break;
-         }
-    }
-
   /* If this decl has namespace scope, set that up.  */
   if (in_namespace)
     set_decl_namespace (decl, in_namespace, friendp);
index 2555ac0f8aa15ad616e69c3760435110128b01e9..f55ecc3454eebdff46a9f4c15e2d2da75eb6a481 100644 (file)
@@ -1,3 +1,22 @@
+2018-07-19  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       Revert fix for c++/59480 (and testsuite followup)
+
+       2018-07-19  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       * g++.old-deja/g++.mike/p784.C: Add -fpermissive.
+
+       2019-07-18  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/59480, DR 136
+       * g++.dg/other/friend8.C: New.
+       * g++.dg/other/friend9.C: Likewise.
+       * g++.dg/other/friend10.C: Likewise.
+       * g++.dg/other/friend11.C: Likewise.
+       * g++.dg/other/friend12.C: Likewise.
+       * g++.dg/parse/defarg4.C: Compile with -fpermissive -w.
+       * g++.dg/parse/defarg8.C: Likewise.
+
 2018-07-19  Andre Vieira  <andre.simoesdiasvieira@arm.com>
 
        * gcc.target/aarch64/profile.c: New test.
diff --git a/gcc/testsuite/g++.dg/other/friend10.C b/gcc/testsuite/g++.dg/other/friend10.C
deleted file mode 100644 (file)
index c162395..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-// PR c++/59480
-
-class test {
-  friend int foo(bool = true) { return 1; }  // { dg-message "14:previous" }
-  template<typename> friend int bar(bool = true) { return 1; }  // { dg-message "33:previous" }
-};
-
-int foo(bool);  // { dg-error "5:friend declaration" }
-template<typename> int bar(bool);  // { dg-error "24:friend declaration" }
diff --git a/gcc/testsuite/g++.dg/other/friend11.C b/gcc/testsuite/g++.dg/other/friend11.C
deleted file mode 100644 (file)
index b82b39d..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-// PR c++/59480
-
-class test {
-  friend int foo(bool = true) { return 1; }  // { dg-message "14:previous" }
-  friend int foo(bool);  // { dg-error "14:friend declaration" }
-  template<typename> friend int bar(bool = true) { return 1; }  // { dg-message "33:previous" }
-  template<typename> friend int bar(bool);  // { dg-error "33:friend declaration" }
-};
diff --git a/gcc/testsuite/g++.dg/other/friend12.C b/gcc/testsuite/g++.dg/other/friend12.C
deleted file mode 100644 (file)
index b78ce4b..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-// PR c++/59480
-
-template<typename>
-class test {
-  friend int foo(bool = true) { return 1; }  // { dg-message "14:previous" }
-  friend int foo(bool);  // { dg-error "14:friend declaration" }
-  template<typename> friend int bar(bool = true) { return 1; }  // { dg-message "33:previous" }
-  template<typename> friend int bar(bool);  // { dg-error "33:friend declaration" }
-};
-
-template class test<bool>;
diff --git a/gcc/testsuite/g++.dg/other/friend8.C b/gcc/testsuite/g++.dg/other/friend8.C
deleted file mode 100644 (file)
index 6b5df88..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-// PR c++/59480
-
-class test {
-  friend int foo(bool = true);  // { dg-error "14:friend declaration" }
-  template<typename> friend int bar(bool = true);  // { dg-error "33:friend declaration" }
-};
diff --git a/gcc/testsuite/g++.dg/other/friend9.C b/gcc/testsuite/g++.dg/other/friend9.C
deleted file mode 100644 (file)
index 16b4f57..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-// PR c++/59480
-
-template<typename>
-class test {
-  friend int foo(bool = true);  // { dg-error "14:friend declaration" }
-  template<typename> friend int bar(bool = true);  // { dg-error "33:friend declaration" }
-};
-
-template class test<bool>;
index ad8a1ed6c65c65a5b87f3e06a5dba5eea05f2e95..151f6c5f668b071d5981d497335782ff89088df5 100644 (file)
@@ -1,4 +1,4 @@
-// { dg-options "-fpermissive -w" }
+// { dg-do compile }
 
 // Copyright (C) 2003 Free Software Foundation, Inc.
 // Contributed by Nathan Sidwell 3 Jul 2003 <nathan@codesourcery.com>
index 33100069eadf94c30455a714413a81f71b40790c..1f1f078aa16dbe05286dfda7c13b802b504d5c14 100644 (file)
@@ -1,5 +1,3 @@
-// { dg-options "-fpermissive -w" }
-
 struct A {
   static void g(int);
 };
index 44d03f109ab74103f8dcc04bccb3fa1e45437e77..04a70c2eee471df2c72b71b32fd5d153bbdfc4a7 100644 (file)
@@ -1,6 +1,6 @@
 // { dg-do assemble  }
 // { dg-require-effective-target ilp32 } */
-// { dg-options "-w -fpermissive" }
+// { dg-options "-w" }
 // prms-id: 784
 
 //# 1 "GctSymbol.GctSymbol.CHMap.cc"