PR c++/24275
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 10 Oct 2005 14:42:14 +0000 (14:42 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 10 Oct 2005 14:42:14 +0000 (14:42 +0000)
* pt.c (instantiate_decl): Instantiate the initializer of
a static data member in the namespace containing the class
containing the static data member.
PR c++/24275
* g++.dg/template/static19.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@105173 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/pt.c
gcc/testsuite/g++.dg/template/static19.C [new file with mode: 0644]

index 317d17f..2bd96a6 100644 (file)
@@ -11558,12 +11558,15 @@ instantiate_decl (tree d, int defer_ok,
          && !DECL_INITIAL (d) 
          && DECL_INITIAL (code_pattern))
        {
+         tree ns = decl_namespace_context (d);
+         push_nested_namespace (ns);
          push_nested_class (DECL_CONTEXT (d));
          DECL_INITIAL (d)
            = tsubst_expr (DECL_INITIAL (code_pattern), 
                           args,
                           tf_error | tf_warning, NULL_TREE);
          pop_nested_class ();
+         pop_nested_namespace (ns);
        }
 
       /* We restore the source position here because it's used by
diff --git a/gcc/testsuite/g++.dg/template/static19.C b/gcc/testsuite/g++.dg/template/static19.C
new file mode 100644 (file)
index 0000000..d720127
--- /dev/null
@@ -0,0 +1,18 @@
+// PR c++/24275
+
+template <bool val>  struct bool_var {
+  static const bool value = val;
+};
+namespace is_inc_ {
+  struct any {
+    template <class T> any(T const&);
+  };
+  int operator++(any const&);
+  template <class T>   struct impl {
+    static T &x;
+    static const bool value = sizeof(++x) == 1;
+  };
+}
+template<typename T> struct is_incr : bool_var< is_inc_::impl<T>::value> {};
+struct not_incr{};
+typedef int sa1[ is_incr<not_incr>::value ? -1 : 1];