diff options
author | Jason Merrill <jason@redhat.com> | 2015-08-18 17:29:01 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2015-08-18 17:29:01 -0400 |
commit | 8e43da810d60823d33cee7a863e80c6a5b7f2941 (patch) | |
tree | 2d280f5f9652eef89bc18abdac0d84dac8c339ae /gcc | |
parent | 61717a4593d0c710b6fed946e8ce9728c83ed369 (diff) | |
download | gcc-8e43da810d60823d33cee7a863e80c6a5b7f2941.zip gcc-8e43da810d60823d33cee7a863e80c6a5b7f2941.tar.gz gcc-8e43da810d60823d33cee7a863e80c6a5b7f2941.tar.bz2 |
DR 1155
DR 1155
* pt.c (convert_nontype_argument): Allow internal linkage in C++11
and up.
From-SVN: r226992
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/pt.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/nontype1.C | 9 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.oliva/template4.C | 2 |
4 files changed, 21 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 0bf33c8..2c2cb6d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +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 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<const L&> int *f() { return 0; } +template<int> char *f(); + +auto r = f<LVar>(); // { 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<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 |