Commit 7f0964e6 by Jason Merrill Committed by Jason Merrill

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
parent 5f864b98
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.
......
......@@ -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))
......
// 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);
}
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