diff options
author | Jason Merrill <jason@redhat.com> | 2019-04-18 12:50:10 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2019-04-18 12:50:10 -0400 |
commit | 7f0964e6f146e333b2d97b1f1a8518a733f3cc17 (patch) | |
tree | ac99b51ca4bd9983b3b21fb9ef944874630a6da6 | |
parent | 5f864b980af671c499756848a3d117968d253d4d (diff) | |
download | gcc-7f0964e6f146e333b2d97b1f1a8518a733f3cc17.zip gcc-7f0964e6f146e333b2d97b1f1a8518a733f3cc17.tar.gz gcc-7f0964e6f146e333b2d97b1f1a8518a733f3cc17.tar.bz2 |
PR c++/87554 - ICE with extern template and reference member.
The removed code ended up setting DECL_INITIAL to the INIT_EXPR returned by
split_nonconstant_init, which makes no sense. This code was added back in
1996, so any rationale is long lost.
* decl.c (cp_finish_decl): Don't set DECL_INITIAL of external vars.
From-SVN: r270445
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/decl.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/extern_template-5.C | 36 |
3 files changed, 42 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index bfaf355..7bb464f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2019-04-18 Jason Merrill <jason@redhat.com> + + PR c++/87554 - ICE with extern template and reference member. + * decl.c (cp_finish_decl): Don't set DECL_INITIAL of external vars. + 2019-04-17 Jason Merrill <jason@redhat.com> PR c++/90047 - ICE with enable_if alias template. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 67d9244..420d6d8 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -7354,8 +7354,7 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p, && ! (DECL_LANG_SPECIFIC (decl) && DECL_NOT_REALLY_EXTERN (decl))) { - if (init) - DECL_INITIAL (decl) = init; + /* check_initializer will have done any constant initialization. */ } /* A variable definition. */ else if (DECL_FUNCTION_SCOPE_P (decl) && !TREE_STATIC (decl)) diff --git a/gcc/testsuite/g++.dg/cpp0x/extern_template-5.C b/gcc/testsuite/g++.dg/cpp0x/extern_template-5.C new file mode 100644 index 0000000..5d41248 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/extern_template-5.C @@ -0,0 +1,36 @@ +// PR c++/87554 +// { dg-options "-O" } + +template < class a > class b { + static void c(a); + static a &create() { c(instance); return mya; } + + static a mya; + +public: + static a d() { create(); return a(); } + static a &instance; +}; +template < class a > a &b< a >::instance = create(); +class e; +class f { +public: + void operator()(int g) { h(g); } + template < class a > void h(a i) { p(j, i); } + e *j; +}; +class e : public f { +public: + e(int); +}; +struct k { + int l; +}; +template < class m, class a > void p(m, a) { b< k >::d(); } +extern template class b< k >; +int n; +int o; +void test() { + e out(o); + out(n); +} |