aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2015-06-12 14:16:22 -0400
committerJason Merrill <jason@gcc.gnu.org>2015-06-12 14:16:22 -0400
commit350562a75dfb4ac658adf620665871eb47166652 (patch)
treefeac1e0f18483ad8990337278b9c0c743948ab99
parentdf649a1c7e07d2b521922aead88d7a1477252762 (diff)
downloadgcc-350562a75dfb4ac658adf620665871eb47166652.zip
gcc-350562a75dfb4ac658adf620665871eb47166652.tar.gz
gcc-350562a75dfb4ac658adf620665871eb47166652.tar.bz2
re PR c++/65719 (Link error with constexpr variable template)
PR c++/65719 * pt.c (tsubst_decl) [VAR_DECL]: Mark namespace-scope variables as DECL_NOT_REALLY_EXTERN. From-SVN: r224442
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/pt.c5
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/var-templ29.C13
3 files changed, 22 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 39b5a08..b18a893 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2015-06-12 Jason Merrill <jason@redhat.com>
+
+ PR c++/65719
+ * pt.c (tsubst_decl) [VAR_DECL]: Mark namespace-scope
+ variables as DECL_NOT_REALLY_EXTERN.
+
2015-06-11 Jason Merrill <jason@redhat.com>
PR c++/66445
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 7f04fe6..ea8c8b6 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -11306,8 +11306,7 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
{
/* T is a static data member or namespace-scope entity.
We have to substitute into namespace-scope variables
- (even though such entities are never templates) because
- of cases like:
+ (not just variable templates) because of cases like:
template <class T> void f() { extern T t; }
@@ -11468,6 +11467,8 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
initializer is present. We mimic the non-template
processing here. */
DECL_EXTERNAL (r) = 1;
+ if (DECL_NAMESPACE_SCOPE_P (t))
+ DECL_NOT_REALLY_EXTERN (r) = 1;
DECL_TEMPLATE_INFO (r) = build_template_info (tmpl, argvec);
SET_DECL_IMPLICIT_INSTANTIATION (r);
diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ29.C b/gcc/testsuite/g++.dg/cpp1y/var-templ29.C
new file mode 100644
index 0000000..22f5b0b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/var-templ29.C
@@ -0,0 +1,13 @@
+// PR c++/65719
+// { dg-do link { target c++14 } }
+
+struct FunctionObject {
+ void operator()() const { }
+};
+
+template <typename T>
+constexpr FunctionObject f{};
+
+int main() {
+ f<int>();
+}