https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84981
Jonathan Wakely <redi at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |rejects-valid
Status|UNCONFIRMED |NEW
Last reconfirmed| |2018-03-19
Ever confirmed|0 |1
--- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Confirmed.
Without the lambda:
template<auto> struct X { };
void f()
{
struct Locale {
static void f() { }
};
X<&Locale::f> x;
}
c12.cc: In function 'void f()':
c12.cc:9:15: error: 'f()::Locale::f' is not a valid template argument for type
'void (*)()' because 'static void f()::Locale::f()' has no linkage
X<&Locale::f> x;
^
This seems to fix it:
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -6259,7 +6259,8 @@ convert_nontype_argument_function (tree type, tree expr,
}
linkage = decl_linkage (fn_no_ptr);
- if (cxx_dialect >= cxx11 ? linkage == lk_none : linkage != lk_external)
+ if ((cxx_dialect < cxx11 && linkage != lk_external)
+ || (cxx_dialect < cxx17 && linkage == lk_none))
{
if (complain & tf_error)
{