aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2018-07-19 16:58:06 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2018-07-19 16:58:06 +0000
commit0d21482100aebb2b53948af330e9f3eb3fe1d9a7 (patch)
tree23aca1331a0ed78ea26e4ede2c6e4f927e709045
parent5170e47ebd80005787c610e6c08a23526906e985 (diff)
downloadgcc-0d21482100aebb2b53948af330e9f3eb3fe1d9a7.zip
gcc-0d21482100aebb2b53948af330e9f3eb3fe1d9a7.tar.gz
gcc-0d21482100aebb2b53948af330e9f3eb3fe1d9a7.tar.bz2
revert: [multiple changes]
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
-rw-r--r--gcc/cp/ChangeLog11
-rw-r--r--gcc/cp/decl.c67
-rw-r--r--gcc/testsuite/ChangeLog19
-rw-r--r--gcc/testsuite/g++.dg/other/friend10.C9
-rw-r--r--gcc/testsuite/g++.dg/other/friend11.C8
-rw-r--r--gcc/testsuite/g++.dg/other/friend12.C11
-rw-r--r--gcc/testsuite/g++.dg/other/friend8.C6
-rw-r--r--gcc/testsuite/g++.dg/other/friend9.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/defarg4.C2
-rw-r--r--gcc/testsuite/g++.dg/parse/defarg8.C2
-rw-r--r--gcc/testsuite/g++.old-deja/g++.mike/p784.C2
11 files changed, 35 insertions, 111 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 4a28c83..125f169 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 5239ffd..3c1e2ef 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -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);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2555ac0..f55ecc3 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index c162395..0000000
--- a/gcc/testsuite/g++.dg/other/friend10.C
+++ /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
index b82b39d..0000000
--- a/gcc/testsuite/g++.dg/other/friend11.C
+++ /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
index b78ce4b..0000000
--- a/gcc/testsuite/g++.dg/other/friend12.C
+++ /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
index 6b5df88..0000000
--- a/gcc/testsuite/g++.dg/other/friend8.C
+++ /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
index 16b4f57..0000000
--- a/gcc/testsuite/g++.dg/other/friend9.C
+++ /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>;
diff --git a/gcc/testsuite/g++.dg/parse/defarg4.C b/gcc/testsuite/g++.dg/parse/defarg4.C
index ad8a1ed..151f6c5 100644
--- a/gcc/testsuite/g++.dg/parse/defarg4.C
+++ b/gcc/testsuite/g++.dg/parse/defarg4.C
@@ -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>
diff --git a/gcc/testsuite/g++.dg/parse/defarg8.C b/gcc/testsuite/g++.dg/parse/defarg8.C
index 3310006..1f1f078 100644
--- a/gcc/testsuite/g++.dg/parse/defarg8.C
+++ b/gcc/testsuite/g++.dg/parse/defarg8.C
@@ -1,5 +1,3 @@
-// { dg-options "-fpermissive -w" }
-
struct A {
static void g(int);
};
diff --git a/gcc/testsuite/g++.old-deja/g++.mike/p784.C b/gcc/testsuite/g++.old-deja/g++.mike/p784.C
index 44d03f1..04a70c2 100644
--- a/gcc/testsuite/g++.old-deja/g++.mike/p784.C
+++ b/gcc/testsuite/g++.old-deja/g++.mike/p784.C
@@ -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"