aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>1999-04-05 23:09:51 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>1999-04-05 23:09:51 +0000
commita7d2d407f901c68a72d08b2868080617a5878656 (patch)
treecb9c5be581f8d0d7642fc8deb66bc0c2cce2b87c
parent7c72138aa2c52e51598f2a1f82325bb109f8b529 (diff)
downloadgcc-a7d2d407f901c68a72d08b2868080617a5878656.zip
gcc-a7d2d407f901c68a72d08b2868080617a5878656.tar.gz
gcc-a7d2d407f901c68a72d08b2868080617a5878656.tar.bz2
decl.c (lookup_name_current_level): Tweak, and improve documentation.
* decl.c (lookup_name_current_level): Tweak, and improve documentation. From-SVN: r26210
-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();
+ };
+}