c++: Move hidden-lambda entity lookup checking
authorNathan Sidwell <nathan@acm.org>
Tue, 18 Aug 2020 13:02:37 +0000 (06:02 -0700)
committerNathan Sidwell <nathan@acm.org>
Tue, 18 Aug 2020 13:05:04 +0000 (06:05 -0700)
Hidden lambda entities only occur in block and class scopes.  There's
no need to check for them on every lookup.  So moving that particular
piece of validation to lookup_name_1, which cares.  Also reordered the
namespace and type checking, as that is also simpler.

gcc/cp/
* name-lookup.c (qualify_lookup): Drop lambda checking here.
Reorder namespace & type checking.
(lookup_name_1): Do hidden lambda checking here.

gcc/cp/name-lookup.c

index ad9c92d..c68ea09 100644 (file)
@@ -5221,24 +5221,16 @@ qualify_lookup (tree val, LOOK_want want)
   if (val == NULL_TREE)
     return false;
 
-  if (bool (want & LOOK_want::NAMESPACE) && TREE_CODE (val) == NAMESPACE_DECL)
-    return true;
-
   if (bool (want & LOOK_want::TYPE))
     {
       tree target_val = strip_using_decl (val);
 
-      if (TREE_CODE (target_val) == TYPE_DECL
-         || TREE_CODE (target_val) == TEMPLATE_DECL)
+      if (TREE_CODE (STRIP_TEMPLATE (target_val)) == TYPE_DECL)
        return true;
     }
 
   if (bool (want & LOOK_want::TYPE_NAMESPACE))
-    return false;
-
-  /* Look through lambda things that we shouldn't be able to see.  */
-  if (!bool (want & LOOK_want::HIDDEN_LAMBDA) && is_lambda_ignored_entity (val))
-    return false;
+    return TREE_CODE (val) == NAMESPACE_DECL;
 
   return true;
 }
@@ -6430,7 +6422,10 @@ lookup_name_1 (tree name, LOOK_where where, LOOK_want want)
   tree val = NULL_TREE;
 
   gcc_checking_assert (unsigned (where) != 0);
-
+  /* If we're looking for hidden lambda things, we shouldn't be
+     looking in namespace scope.  */
+  gcc_checking_assert (!bool (want & LOOK_want::HIDDEN_LAMBDA)
+                      || !bool (where & LOOK_where::NAMESPACE));
   query_oracle (name);
 
   /* Conversion operators are handled specially because ordinary
@@ -6481,7 +6476,10 @@ lookup_name_1 (tree name, LOOK_where where, LOOK_want want)
          continue;
 
        /* If this is the kind of thing we're looking for, we're done.  */
-       if (qualify_lookup (iter->value, want))
+       if (iter->value
+           && (bool (want & LOOK_want::HIDDEN_LAMBDA)
+               || !is_lambda_ignored_entity (iter->value))
+           && qualify_lookup (iter->value, want))
          binding = iter->value;
        else if (bool (want & LOOK_want::TYPE)
                 && qualify_lookup (iter->type, want))