aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/decl.c14
-rw-r--r--gcc/testsuite/g++.old-deja/g++.other/crash8.C10
3 files changed, 22 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 0e3c6fe..e5d86a9 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@
1999-04-05 Mark Mitchell <mark@codesourcery.com>
+ * decl.c (lookup_name_current_level): Tweak, and improve
+ documentation.
+
* class.c (maybe_fixup_vptrs): Remove declaration.
(build_class_init_list): Likewise.
* decl.c (pushdecl_class_level): Call check_template_shadow here
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 0372dae..0989237 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -5727,15 +5727,21 @@ lookup_name (name, prefer_type)
return lookup_name_real (name, prefer_type, 0, 0);
}
-/* Similar to `lookup_name' but look only at current binding level. */
+/* Similar to `lookup_name' but look only in the innermost non-class
+ binding level. */
tree
lookup_name_current_level (name)
tree name;
{
- register tree t = NULL_TREE;
+ struct binding_level *b;
+ tree t = NULL_TREE;
+
+ b = current_binding_level;
+ while (b->parm_flag == 2)
+ b = b->level_chain;
- if (current_binding_level->namespace_p)
+ if (b->namespace_p)
{
t = IDENTIFIER_NAMESPACE_VALUE (name);
@@ -5746,8 +5752,6 @@ lookup_name_current_level (name)
else if (IDENTIFIER_BINDING (name)
&& LOCAL_BINDING_P (IDENTIFIER_BINDING (name)))
{
- struct binding_level *b = current_binding_level;
-
while (1)
{
if (BINDING_LEVEL (IDENTIFIER_BINDING (name)) == b)
diff --git a/gcc/testsuite/g++.old-deja/g++.other/crash8.C b/gcc/testsuite/g++.old-deja/g++.other/crash8.C
new file mode 100644
index 0000000..22b27ef
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.other/crash8.C
@@ -0,0 +1,10 @@
+// Build don't link:
+// Origin: Jason Merrill <jason@cygnus.com>
+
+int main()
+{
+ void f();
+ class A {
+ friend void f();
+ };
+}