On 3/17/26 9:39 AM, Thomas Berger wrote:
Am Montag, 16. März 2026, 19:40:09 Mitteleuropäische Normalzeit schrieb Jason
Merrill:
On 3/15/26 7:57 AM, Thomas Berger wrote:
diff --git a/gcc/cp/name-lookup.cc b/gcc/cp/name-lookup.cc
index 13aafab4e68..8addd3b29ca 100644
--- a/gcc/cp/name-lookup.cc
+++ b/gcc/cp/name-lookup.cc
@@ -1848,6 +1848,7 @@ member_vec_linear_search (vec<tree, va_gc>
*member_vec, tree name)>
   static tree
   fields_linear_search (tree klass, tree name, bool want_type)
   {

+  tree found = NULL_TREE;

     for (tree fields = TYPE_FIELDS (klass); fields; fields = DECL_CHAIN
     (fields))>
       {
tree decl = fields;

@@ -1878,11 +1879,23 @@ fields_linear_search (tree klass, tree name, bool
want_type)>
        /* Functions are found separately.  */
        continue;

-      if (!want_type || DECL_DECLARES_TYPE_P (decl))
+      if (DECL_DECLARES_TYPE_P (decl))
+       {
+         if (want_type)

We could also return immediately if !DECL_IMPLICIT_TYPEDEF_P.

I had a look, but this seems to break a few cases. For example:
(from g++.old-deja/g++.other/lookup23.C)

   struct a { int a; };
   struct b : a {};
b x; void foo ()
   {
     x.a = 22;
   }

Breaks with "invalid use of 'a::a'"

Ah, I guess we also need to check !DECL_SELF_REFERENCE_P.

Jason

Reply via email to