Commit 0d214821 by Paolo Carlini Committed by Paolo Carlini

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
parent 5170e47e
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
......
......@@ -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);
......
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.
......
// 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" }
// 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" }
};
// 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>;
// 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" }
};
// 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>;
// { dg-options "-fpermissive -w" }
// { dg-do compile }
// Copyright (C) 2003 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 3 Jul 2003 <nathan@codesourcery.com>
......
// { dg-options "-fpermissive -w" }
struct A {
static void g(int);
};
......
// { dg-do assemble }
// { dg-require-effective-target ilp32 } */
// { dg-options "-w -fpermissive" }
// { dg-options "-w" }
// prms-id: 784
//# 1 "GctSymbol.GctSymbol.CHMap.cc"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment