summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/ChangeLog12
-rw-r--r--gcc/cp/name-lookup.c8
-rw-r--r--gcc/cp/repo.c6
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/g++.dg/lookup/friend9.C23
-rw-r--r--gcc/testsuite/g++.dg/template/repo5.C11
6 files changed, 67 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 4c0381220df..9102cbc1bd3 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,15 @@
+2006-01-03 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/25492
+ * name-lookup.c (push_class_level_binding): When a derived class
+ provides a type binding, eliminate any type binding from a base
+ class.
+
+ PR c++/25625
+ * repo.c (repo_emit_p): Always instantiate static data members
+ initialized by constant expressions, so that there values are
+ available.
+
2006-01-02 Mark Mitchell <mark@codesourcery.com>
PR c++/25635
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index dcd20f7e713..ec662e6566a 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -2669,7 +2669,13 @@ push_class_level_binding (tree name, tree x)
INHERITED_VALUE_BINDING_P (binding) = 0;
}
else
- old_decl = bval;
+ {
+ old_decl = bval;
+ /* Any inherited type declaration is hidden by the type
+ declaration in the derived class. */
+ if (TREE_CODE (x) == TYPE_DECL && DECL_ARTIFICIAL (x))
+ binding->type = NULL_TREE;
+ }
}
else if (TREE_CODE (x) == OVERLOAD && is_overloaded_fn (bval))
old_decl = bval;
diff --git a/gcc/cp/repo.c b/gcc/cp/repo.c
index d2fae3e0a17..ad01010c363 100644
--- a/gcc/cp/repo.c
+++ b/gcc/cp/repo.c
@@ -298,6 +298,12 @@ repo_emit_p (tree decl)
&& (!TYPE_LANG_SPECIFIC (type)
|| !CLASSTYPE_TEMPLATE_INSTANTIATION (type)))
return 2;
+ /* Static data members initialized by constant expressions must
+ be processed where needed so that their definitions are
+ available. */
+ if (DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl)
+ && DECL_CLASS_SCOPE_P (decl))
+ return 2;
}
else if (!DECL_TEMPLATE_INSTANTIATION (decl))
return 2;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9d4355caa65..e02c3c7a510 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2006-01-03 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/25492
+ * g++.dg/lookup/friend9.C: New test.
+
+ PR c++/25625
+ * g++.dg/template/repo5.C: New test.
+
2006-01-03 Steven G. Kargl <kargls@comcast.net>
PR fortran/25101
diff --git a/gcc/testsuite/g++.dg/lookup/friend9.C b/gcc/testsuite/g++.dg/lookup/friend9.C
new file mode 100644
index 00000000000..caf685c3ece
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/friend9.C
@@ -0,0 +1,23 @@
+// PR c++/25492
+
+class Base {
+public:
+ class Nested {};
+};
+
+class Derived:public Base {
+public:
+ class Nested {
+ public:
+ void m();
+ };
+ class AnotherNested {
+ friend class Nested;
+ AnotherNested() {}
+ };
+};
+
+void Derived::Nested::m() {
+ Derived::AnotherNested instance;
+
+}
diff --git a/gcc/testsuite/g++.dg/template/repo5.C b/gcc/testsuite/g++.dg/template/repo5.C
new file mode 100644
index 00000000000..5b76f43f733
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/repo5.C
@@ -0,0 +1,11 @@
+// PR c++/25625
+// { dg-options "-frepo" }
+
+template< typename T, T N > struct integral_c {
+ static const T value = N;
+ typedef integral_c< T, value + 1 > next;
+};
+template< typename T, T N > T const integral_c< T, N >::value;
+integral_c<int,0> a;
+
+int main () {}