instantiate_decl's setting of pattern_defined never got adjusted for variable templates; it was still checking DECL_IN_AGGR_P to decide whether a static data member temploid is defined, which doesn't make sense for namespace-scope variable templates.
Tested x86_64-pc-linux-gnu, applying to trunk, 5, 6.
commit 735ad45cb16c7703e1f5ec427c24b6809adb8ebb Author: Jason Merrill <ja...@redhat.com> Date: Thu Jul 21 17:06:42 2016 -0400 PR c++/71630 - extern variable template * pt.c (instantiate_decl): Fix pattern_defined for namespace scope variable templates. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index d7f3808..5e29d99 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -21853,7 +21853,10 @@ instantiate_decl (tree d, int defer_ok, else { deleted_p = false; - pattern_defined = ! DECL_IN_AGGR_P (code_pattern); + if (DECL_CLASS_SCOPE_P (code_pattern)) + pattern_defined = ! DECL_IN_AGGR_P (code_pattern); + else + pattern_defined = ! DECL_EXTERNAL (code_pattern); } /* We may be in the middle of deferred access check. Disable it now. */ diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ53.C b/gcc/testsuite/g++.dg/cpp1y/var-templ53.C new file mode 100644 index 0000000..3e30d67 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/var-templ53.C @@ -0,0 +1,10 @@ +// PR c++/71630 +// { dg-do compile { target c++14 } } + +template <class T> +extern T pi; + +int main() +{ + return pi<int>; +}