]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/20350 (extern template and struct initializer and specification for a stati...
authorNathan Sidwell <nathan@codesourcery.com>
Thu, 2 Jun 2005 09:09:48 +0000 (09:09 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Thu, 2 Jun 2005 09:09:48 +0000 (09:09 +0000)
cp:
PR c++/20350
* decl.c (duplicate_decls): Copy all of DECL_USE_TEMPLATE.
testsuite:
PR c++/20350
* g++.dg/template/spec24.C: New.

From-SVN: r100486

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/spec24.C [new file with mode: 0644]

index 884d3461987841180767f8907fb56b7fd6685afd..1314bcfbc99941ac8b740c101ebda9ce38913302 100644 (file)
@@ -1,5 +1,8 @@
 2005-06-02  Nathan Sidwell  <nathan@codesourcery.com>
 
+       PR c++/20350
+       * decl.c (duplicate_decls): Copy all of DECL_USE_TEMPLATE.
+
        PR c++/21151
        * name-lookup.c (pushtag): Push local class even in a template.
 
index 7f919d5c99b2bf4872d64e1c6ff9199394db2a4a..83bd6fc9324fc0945a31842ef487f0e5d10a1917 100644 (file)
@@ -1672,13 +1672,14 @@ duplicate_decls (tree newdecl, tree olddecl)
       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);
index 07ab9b92412d743518973edf0a6bd601cedd2e2c..47359036e3ada03670f3d204b7f69217190d6e7c 100644 (file)
@@ -1,5 +1,8 @@
 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.
diff --git a/gcc/testsuite/g++.dg/template/spec24.C b/gcc/testsuite/g++.dg/template/spec24.C
new file mode 100644 (file)
index 0000000..0884895
--- /dev/null
@@ -0,0 +1,22 @@
+// 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;
+}
+