commit 6fe0feb89daa09ff32709ca10734f8063a26f6e9 Author: Jason Merrill Date: Mon Aug 17 15:18:03 2015 -0400 DR 1155 * pt.c (convert_nontype_argument): Allow internal linkage in C++11 and up. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index b84bda4..eaafaef 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -6469,16 +6469,18 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain) { if (complain & tf_error) error ("%qE is not a valid template argument for type %qT " - "because it is not an object with external linkage", + "because it is not an object with linkage", expr, type); return NULL_TREE; } - if (!DECL_EXTERNAL_LINKAGE_P (expr)) + /* DR 1155 allows internal linkage in C++11 and up. */ + linkage_kind linkage = decl_linkage (expr); + if (linkage < (cxx_dialect >= cxx11 ? lk_internal : lk_external)) { if (complain & tf_error) error ("%qE is not a valid template argument for type %qT " - "because object %qD has not external linkage", + "because object %qD does not have linkage", expr, type, expr); return NULL_TREE; } diff --git a/gcc/testsuite/g++.dg/cpp0x/nontype1.C b/gcc/testsuite/g++.dg/cpp0x/nontype1.C new file mode 100644 index 0000000..29dff363 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nontype1.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } + +struct L { constexpr operator int() const { return 0; } }; +constexpr L LVar{}; + +template int *f() { return 0; } +template char *f(); + +auto r = f(); // { dg-error "ambiguous" } diff --git a/gcc/testsuite/g++.old-deja/g++.oliva/template4.C b/gcc/testsuite/g++.old-deja/g++.oliva/template4.C index 2268fde..ef607f6 100644 --- a/gcc/testsuite/g++.old-deja/g++.oliva/template4.C +++ b/gcc/testsuite/g++.old-deja/g++.oliva/template4.C @@ -11,7 +11,7 @@ int a = 1; X x; // ok, a has external linkage const int b = 2; -X y; // { dg-error "" } const b has internal linkage +X y; // { dg-error "" "" { target c++98_only } } const b has internal linkage extern const int c; X z; // ok, c has external linkage