Commit 8e43da81 by Jason Merrill Committed by Jason Merrill

DR 1155

	DR 1155
	* pt.c (convert_nontype_argument): Allow internal linkage in C++11
	and up.

From-SVN: r226992
parent 61717a45
2015-08-18 Jason Merrill <jason@redhat.com>
DR 1155
* pt.c (convert_nontype_argument): Allow internal linkage in C++11
and up.
2015-08-17 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/67216
......
......@@ -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;
}
......
// { dg-do compile { target c++11 } }
struct L { constexpr operator int() const { return 0; } };
constexpr L LVar{};
template<const L&> int *f() { return 0; }
template<int> char *f();
auto r = f<LVar>(); // { dg-error "ambiguous" }
......@@ -11,7 +11,7 @@ int a = 1;
X<a> x; // ok, a has external linkage
const int b = 2;
X<b> y; // { dg-error "" } const b has internal linkage
X<b> y; // { dg-error "" "" { target c++98_only } } const b has internal linkage
extern const int c;
X<c> z; // ok, c has external linkage
......
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