[C++ PATCH] Simplify class member lookup
authorNathan Sidwell <nathan@acm.org>
Wed, 1 May 2019 11:38:54 +0000 (11:38 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Wed, 1 May 2019 11:38:54 +0000 (11:38 +0000)
https://gcc.gnu.org/ml/gcc-patches/2019-05/msg00004.html
gcc/cp/
* name-lookup.h (get_class_binding_direct): Change final arg to
bool.
(get_class_binding): Likewise.
* name-lookup.c (get_class_binding_direct): Replace TYPE_OR_FNS
arg with WANT_TYPE bool.  Simplify.
(get_class_binding): Adjust final arg.
* decl.c (reshape_init_class): Adjust get_class_binding calls.

gcc/testsuite/
* g++.dg/cpp0x/decltype9.C: Adjust expected diagnostics.

From-SVN: r270765

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/cp/name-lookup.c
gcc/cp/name-lookup.h
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/decltype9.C

index ec15854d22d8125640992b93216f9e5db70af095..3213b4aa2df10507504812cf7f0d2ee4fcf9a7eb 100644 (file)
@@ -1,3 +1,13 @@
+2019-05-01  Nathan Sidwell  <nathan@acm.org>
+
+       * name-lookup.h (get_class_binding_direct): Change final arg to
+       bool.
+       (get_class_binding): Likewise.
+       * name-lookup.c (get_class_binding_direct): Replace TYPE_OR_FNS
+       arg with WANT_TYPE bool.  Simplify.
+       (get_class_binding): Adjust final arg.
+       * decl.c (reshape_init_class): Adjust get_class_binding calls.
+
 2019-04-30  Nathan Sidwell  <nathan@acm.org>
 
        * cp-objcp-common.c (cp_common_init_ts): Use MARK_TS_EXP for _EXPR
index 5c4a38e7980408a3157a83651869ea89d094777e..ee38ac25e6599f24b9825588b7c5e40e673ff262 100644 (file)
@@ -5968,12 +5968,12 @@ reshape_init_class (tree type, reshape_iter *d, bool first_initializer_p,
                  tree id = DECL_NAME (d->cur->index);
                  gcc_assert (id);
                  gcc_checking_assert (d->cur->index
-                                      == get_class_binding (type, id, false));
+                                      == get_class_binding (type, id));
                  field = d->cur->index;
                }
            }
          else if (TREE_CODE (d->cur->index) == IDENTIFIER_NODE)
-           field = get_class_binding (type, d->cur->index, false);
+           field = get_class_binding (type, d->cur->index);
          else
            {
              if (complain & tf_error)
index 4ca976c812d84d87c69147276f834c6a582b1ff8..89d85f6c7d7b1a8e7be9c608d5584acc548b931d 100644 (file)
@@ -1217,7 +1217,7 @@ search_anon_aggr (tree anon, tree name, bool want_type)
    Use this if you do not want lazy member creation.  */
 
 tree
-get_class_binding_direct (tree klass, tree name, int type_or_fns)
+get_class_binding_direct (tree klass, tree name, bool want_type)
 {
   gcc_checking_assert (RECORD_OR_UNION_TYPE_P (klass));
 
@@ -1233,31 +1233,26 @@ get_class_binding_direct (tree klass, tree name, int type_or_fns)
       val = member_vec_binary_search (member_vec, lookup);
       if (!val)
        ;
-      else if (type_or_fns > 0)
-       {
-         if (STAT_HACK_P (val))
-           val = STAT_TYPE (val);
-         else if (!DECL_DECLARES_TYPE_P (val))
-           val = NULL_TREE;
-       }
       else if (STAT_HACK_P (val))
-       val = STAT_DECL (val);
+       val = want_type ? STAT_TYPE (val) : STAT_DECL (val);
+      else if (want_type && !DECL_DECLARES_TYPE_P (val))
+       val = NULL_TREE;
     }
   else
     {
-      if (member_vec && type_or_fns <= 0)
+      if (member_vec && !want_type)
        val = member_vec_linear_search (member_vec, lookup);
 
-      if (type_or_fns < 0)
-       /* Don't bother looking for field.  We don't want it.  */;
-      else if (!val || (TREE_CODE (val) == OVERLOAD
-                       && OVL_DEDUP_P (val)))
+      if (!val || (TREE_CODE (val) == OVERLOAD && OVL_DEDUP_P (val)))
        /* Dependent using declarations are a 'field', make sure we
           return that even if we saw an overload already.  */
-       if (tree field_val = fields_linear_search (klass, lookup,
-                                                  type_or_fns > 0))
-         if (!val || TREE_CODE (field_val) == USING_DECL)
-           val = field_val;
+       if (tree field_val = fields_linear_search (klass, lookup, want_type))
+         {
+           if (!val)
+             val = field_val;
+           else if (TREE_CODE (field_val) == USING_DECL)
+             val = ovl_make (field_val, val);
+         }
     }
 
   /* Extract the conversion operators asked for, unless the general
@@ -1278,7 +1273,7 @@ get_class_binding_direct (tree klass, tree name, int type_or_fns)
    special function creation as necessary.  */
 
 tree
-get_class_binding (tree klass, tree name, int type_or_fns)
+get_class_binding (tree klass, tree name, bool want_type)
 {
   klass = complete_type (klass);
 
@@ -1308,7 +1303,7 @@ get_class_binding (tree klass, tree name, int type_or_fns)
        }
     }
 
-  return get_class_binding_direct (klass, name, type_or_fns);
+  return get_class_binding_direct (klass, name, want_type);
 }
 
 /* Find the slot containing overloads called 'NAME'.  If there is no
index a47486d1b8a9c209c73166773147c3408f936b9e..311654af75d87071a84bcc1b9bc63b72e7cc9283 100644 (file)
@@ -303,8 +303,8 @@ extern void do_namespace_alias (tree, tree);
 extern tree do_class_using_decl (tree, tree);
 extern tree lookup_arg_dependent (tree, tree, vec<tree, va_gc> *);
 extern tree search_anon_aggr (tree, tree, bool = false);
-extern tree get_class_binding_direct (tree, tree, int type_or_fns = -1);
-extern tree get_class_binding (tree, tree, int type_or_fns = -1);
+extern tree get_class_binding_direct (tree, tree, bool want_type = false);
+extern tree get_class_binding (tree, tree, bool want_type = false);
 extern tree *find_member_slot (tree klass, tree name);
 extern tree *add_member_slot (tree klass, tree name);
 extern void resort_type_member_vec (void *, void *,
index 2d0240bbc7a98d322926a898822c7c8a33dce95c..1427a8ee523f4ec1024a322637274e1f77f2221b 100644 (file)
@@ -1,3 +1,7 @@
+2019-05-01  Nathan Sidwell  <nathan@acm.org>
+
+       * g++.dg/cpp0x/decltype9.C: Adjust expected diagnostics.
+
 2019-04-30  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/89093
index 45cd9ed7da3ed9db2fe7612310dbb5f26d0a5e15..f6cfb0c67c160b63b3ea6e54e7e01d9f7b26e048 100644 (file)
@@ -2,8 +2,7 @@
 // { dg-do compile { target c++11 } }
 
 template<int> struct A { // { dg-message "defined here" }
-  static int i;
+  static int i; // { dg-message "candidate" }
 };
 
 template<int N> int A<N>::i(decltype (A::i));  // { dg-error "no declaration" }
-// { dg-message "no functions" "note" { target *-*-* } .-1 }