c++: using-decl instantiation
authorNathan Sidwell <nathan@acm.org>
Tue, 3 Nov 2020 18:21:20 +0000 (10:21 -0800)
committerNathan Sidwell <nathan@acm.org>
Tue, 3 Nov 2020 18:23:44 +0000 (10:23 -0800)
In streaming using decls I needed to check some assumptions.  This
adds those checks to the instantiation machinery.

gcc/cp/
* pt.c (tsubst_expr): Simplify using decl instantiation, add
asserts.

gcc/cp/pt.c

index 388423ba14389cc9e75dbb769df424eb0ed87808..b782fb535ebbd4646fa3626834503434cbbdd427 100644 (file)
@@ -18058,11 +18058,18 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl,
          finish_label_decl (DECL_NAME (decl));
        else if (TREE_CODE (decl) == USING_DECL)
          {
+           /* We cannot have a member-using decl here (until 'using
+              enum T' is a thing).  */
+           gcc_checking_assert (!DECL_DEPENDENT_P (decl));
+
+           /* This must be a non-dependent using-decl, and we'll have
+              used the names it found during template parsing.  We do
+              not want to do the lookup again, because we might not
+              find the things we found then.  (Again, using enum T
+              might mean we have to do things here.)  */
            tree scope = USING_DECL_SCOPE (decl);
-           tree name = DECL_NAME (decl);
-
-           scope = tsubst (scope, args, complain, in_decl);
-           finish_nonmember_using_decl (scope, name);
+           gcc_checking_assert (scope
+                                == tsubst (scope, args, complain, in_decl));
          }
        else if (is_capture_proxy (decl)
                 && !DECL_TEMPLATE_INSTANTIATION (current_function_decl))