re PR c++/24275 (Previously accepted code fails with 4.0.2)

PR c++/24275
	* 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.

From-SVN: r105173
This commit is contained in:
Mark Mitchell 2005-10-10 14:42:14 +00:00
parent f0d60e2210
commit 27a725e293
2 changed files with 21 additions and 0 deletions

View 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

View File

@ -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];