DECL_COMDAT (newdecl) |= DECL_COMDAT (olddecl);
DECL_TEMPLATE_INSTANTIATED (newdecl)
|= DECL_TEMPLATE_INSTANTIATED (olddecl);
- /* If the OLDDECL is an implicit instantiation, then the NEWDECL
- must be too. But, it may not yet be marked as such if the
- caller has created NEWDECL, but has not yet figured out that
- it is a redeclaration. */
- if (DECL_IMPLICIT_INSTANTIATION (olddecl)
- && !DECL_USE_TEMPLATE (newdecl))
- SET_DECL_IMPLICIT_INSTANTIATION (newdecl);
+
+ /* If the OLDDECL is an instantiation and/or specialization,
+ then the NEWDECL must be too. But, it may not yet be marked
+ as such if the caller has created NEWDECL, but has not yet
+ figured out that it is a redeclaration. */
+ if (!DECL_USE_TEMPLATE (newdecl))
+ DECL_USE_TEMPLATE (newdecl) = DECL_USE_TEMPLATE (olddecl);
+
/* Don't really know how much of the language-specific
values we should copy from old to new. */
DECL_IN_AGGR_P (newdecl) = DECL_IN_AGGR_P (olddecl);
2005-06-02 Nathan Sidwell <nathan@codesourcery.com>
+ PR c++/20350
+ * g++.dg/template/spec24.C: New.
+
PR c++/21151
* g++.dg/pch/local-1.C: New.
* g++.dg/pch/local-1.Hs: New.
--- /dev/null
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 1 June 2005 <nathan@codesourcery.com>
+
+// PR 20350: ICE on member specialization with later initialization
+// Origin: Carlo Wood carlo@gcc.gnu.org
+
+template <int i> struct Mutex
+{
+ static int mutex;
+};
+
+template <int i>
+int Mutex<i>::mutex = {1};
+
+template <> int Mutex<0>::mutex;
+template <> int Mutex<0>::mutex = 0;
+
+void g()
+{
+ Mutex<0>::mutex = 0;
+}
+