+2018-02-16 Nathan Sidwell <nathan@acm.org>
+
+ * doc/extend.texi (Backwards Compatibility): Mention friend
+ injection. Note for-scope is deprecated.
+ * doc/invoke.texi (-ffriend-injection): Deprecate.
+
2018-02-16 Segher Boessenkool <segher@kernel.crashing.org>
* combine.c (try_combine): When adjusting LOG_LINKS for the destination
+2018-02-16 Nathan Sidwell <nathan@acm.org>
+
+ Deprecate -ffriend-injection.
+ * decl.c (cxx_init_decl_processing): Emit warning on option.
+ * name-lookup.c (do_pushdecl): Emit warning if we push a visible
+ friend.
+
2018-02-16 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/82468
pop_namespace ();
flag_noexcept_type = (cxx_dialect >= cxx17);
+ /* There's no fixed location for <command-line>, the current
+ location is <builtins>, which is somewhat confusing. */
if (!flag_new_for_scope)
- warning (OPT_Wdeprecated, "%<-fno-for-scope%> is deprecated");
+ warning_at (UNKNOWN_LOCATION, OPT_Wdeprecated,
+ "%<-fno-for-scope%> is deprecated");
+ if (flag_friend_injection)
+ warning_at (UNKNOWN_LOCATION, OPT_Wdeprecated,
+ "%<-ffriend-injection%> is deprecated");
c_common_nodes_and_builtins ();
old = OVL_CHAIN (old);
check_template_shadow (decl);
+ bool visible_injection = false;
if (DECL_DECLARES_FUNCTION_P (decl))
{
if (!flag_friend_injection)
/* Hide it from ordinary lookup. */
DECL_ANTICIPATED (decl) = DECL_HIDDEN_FRIEND_P (decl) = true;
+ else
+ visible_injection = true;
}
}
}
else if (VAR_P (decl))
maybe_register_incomplete_var (decl);
+ else if (visible_injection)
+ warning (0, "injected friend %qD is visible"
+ " due to %<-ffriend-injection%>", decl);
if ((VAR_P (decl) || TREE_CODE (decl) == FUNCTION_DECL)
&& DECL_EXTERN_C_P (decl))
@table @code
@item For scope
-If a variable is declared at for scope, it used to remain in scope until
-the end of the scope that contained the for statement (rather than just
-within the for scope). G++ retains this, but issues a warning, if such a
+If a variable is declared at for scope, it used to remain in scope
+until the end of the scope that contained the for statement (rather
+than just within the for scope). The deprecated
+@option{-fno-for-scope} option enables this non-standard behaviour.
+Without the option, G++ retains this, but issues a warning, if such a
variable is accessed outside the for scope.
+The behaviour is deprecated, only available with @option{-std=c++98}
+@option{-std=gnu++98} languages and you must use the
+@option{-fpermissive} option to enable it. The behaviour will be
+removed.
+
+@item Friend Injection
+The @option{-ffriend-injection} option makes injected friends visible
+to regular name lookup, unlike standard C++. This option is
+deprecated and will be removed.
+
@item Implicit C language
Old C system header files did not contain an @code{extern "C" @{@dots{}@}}
scope to set the language. On such systems, all header files are
in an enclosing scope can only be found using argument dependent
lookup. GCC defaults to the standard behavior.
-This option is for compatibility, and may be removed in a future
-release of G++.
+This option is deprecated and will be removed.
@item -fno-elide-constructors
@opindex fno-elide-constructors
+2018-02-16 Nathan Sidwell <nathan@acm.org>
+
+ * g++.old-deja/g++.jason/scoping15.C: Expect warnings.
+ * g++.old-deja/g++.mike/net43.C: Likewise.
+
2018-02-16 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/82468
// Bug: g++ ignores the :: qualification and dies trying to treat an integer
// variable as a list of functions.
+class DComplex;
+double imag (const DComplex&);
+
class DComplex {
public:
- friend double imag(const DComplex& a);
+ friend double imag(const DComplex& a); // Not injected, no warning
};
class FComplex {
public:
- friend float imag(const FComplex& a);
+ friend float imag(const FComplex& a); // { dg-warning "is visible"
};
void
int imag;
::imag( cx[0] );
}
+// { dg-warning "ffriend-injection.* is deprecated" "" { target *-*-* } cc1plus: }
// { dg-do assemble }
-// { dg-options "-ffriend-injection" }
+// { dg-options "-ffriend-injection -Wno-deprecated" }
class foo {
public:
- friend int operator ^(const foo&, const foo&);
+ friend int operator ^(const foo&, const foo&); // { dg-message "is visible" }
};
int main ()