aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/name-lookup.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/cp/name-lookup.cc')
-rw-r--r--gcc/cp/name-lookup.cc77
1 files changed, 52 insertions, 25 deletions
diff --git a/gcc/cp/name-lookup.cc b/gcc/cp/name-lookup.cc
index aa2dc0e..f5b36c9 100644
--- a/gcc/cp/name-lookup.cc
+++ b/gcc/cp/name-lookup.cc
@@ -1049,7 +1049,7 @@ name_lookup::search_usings (tree scope)
bool found = false;
if (vec<tree, va_gc> *usings = NAMESPACE_LEVEL (scope)->using_directives)
for (unsigned ix = usings->length (); ix--;)
- found |= search_qualified ((*usings)[ix], true);
+ found |= search_qualified (strip_using_decl ((*usings)[ix]), true);
/* Look in its inline children. */
if (vec<tree, va_gc> *inlinees = DECL_NAMESPACE_INLINEES (scope))
@@ -1121,7 +1121,7 @@ name_lookup::queue_usings (using_queue& queue, int depth, vec<tree, va_gc> *usin
{
if (usings)
for (unsigned ix = usings->length (); ix--;)
- queue_namespace (queue, depth, (*usings)[ix]);
+ queue_namespace (queue, depth, strip_using_decl ((*usings)[ix]));
}
/* Unqualified namespace lookup in SCOPE.
@@ -4556,6 +4556,9 @@ lookup_imported_hidden_friend (tree friend_tmpl)
|| !DECL_MODULE_ENTITY_P (inner))
return NULL_TREE;
+ /* Load any templates matching FRIEND_TMPL from importers. */
+ lazy_load_pendings (friend_tmpl);
+
tree name = DECL_NAME (inner);
tree *slot = find_namespace_slot (current_namespace, name, false);
if (!slot || !*slot || TREE_CODE (*slot) != BINDING_VECTOR)
@@ -6865,7 +6868,7 @@ using_directives_contain_std_p (vec<tree, va_gc> *usings)
return false;
for (unsigned ix = usings->length (); ix--;)
- if ((*usings)[ix] == std_node)
+ if (strip_using_decl ((*usings)[ix]) == std_node)
return true;
return false;
@@ -7085,13 +7088,16 @@ namespace_hints::convert_candidates_to_name_hint ()
/* Clean up CANDIDATES. */
m_candidates.release ();
return name_hint (expr_to_string (candidate),
- new show_candidate_location (m_loc, candidate));
+ std::make_unique<show_candidate_location> (m_loc,
+ candidate));
}
else if (m_candidates.length () > 1)
/* If we have more than one candidate, issue a name_hint without a single
"suggestion", but with a deferred diagnostic that lists the
various candidates. This takes ownership of m_candidates. */
- return name_hint (NULL, new suggest_alternatives (m_loc, m_candidates));
+ return name_hint (NULL,
+ std::make_unique<suggest_alternatives> (m_loc,
+ m_candidates));
/* Otherwise, m_candidates ought to be empty, so no cleanup is necessary. */
gcc_assert (m_candidates.length () == 0);
@@ -7111,10 +7117,11 @@ name_hint
namespace_hints::maybe_decorate_with_limit (name_hint hint)
{
if (m_limited)
- return name_hint (hint.suggestion (),
- new namespace_limit_reached (m_loc, m_limit,
- m_name,
- hint.take_deferred ()));
+ return name_hint
+ (hint.suggestion (),
+ std::make_unique<namespace_limit_reached> (m_loc, m_limit,
+ m_name,
+ hint.take_deferred ()));
else
return hint;
}
@@ -7188,13 +7195,14 @@ suggest_alternatives_for_1 (location_t location, tree name,
/* Look for exact matches for builtin defines that would have been
defined if the user had passed a command-line option (e.g. -fopenmp
for "_OPENMP"). */
- diagnostic_option_id option_id
+ diagnostics::option_id option_id
= get_option_for_builtin_define (IDENTIFIER_POINTER (name));
if (option_id.m_idx > 0)
- return name_hint (nullptr,
- new suggest_missing_option (location,
- IDENTIFIER_POINTER (name),
- option_id));
+ return name_hint
+ (nullptr,
+ std::make_unique<suggest_missing_option> (location,
+ IDENTIFIER_POINTER (name),
+ option_id));
/* Otherwise, consider misspellings. */
if (!suggest_misspellings)
@@ -7322,8 +7330,9 @@ maybe_suggest_missing_std_header (location_t location, tree name)
if (!header_hint)
return name_hint ();
- return name_hint (NULL, new missing_std_header (location, name_str,
- header_hint));
+ return name_hint (nullptr,
+ std::make_unique<missing_std_header> (location, name_str,
+ header_hint));
}
/* Attempt to generate a name_hint that suggests a missing header file
@@ -7705,12 +7714,12 @@ class macro_use_before_def : public deferred_diagnostic
public:
/* Factory function. Return a new macro_use_before_def instance if
appropriate, or return NULL. */
- static macro_use_before_def *
+ static std::unique_ptr<macro_use_before_def>
maybe_make (location_t use_loc, cpp_hashnode *macro)
{
location_t def_loc = cpp_macro_definition_location (macro);
if (def_loc == UNKNOWN_LOCATION)
- return NULL;
+ return nullptr;
/* We only want to issue a note if the macro was used *before* it was
defined.
@@ -7718,12 +7727,11 @@ class macro_use_before_def : public deferred_diagnostic
used, leaving it unexpanded (e.g. by using the wrong argument
count). */
if (!linemap_location_before_p (line_table, use_loc, def_loc))
- return NULL;
+ return nullptr;
- return new macro_use_before_def (use_loc, macro);
+ return std::make_unique<macro_use_before_def> (use_loc, macro);
}
- private:
/* Ctor. LOC is the location of the usage. MACRO is the
macro that was used. */
macro_use_before_def (location_t loc, cpp_hashnode *macro)
@@ -7790,10 +7798,11 @@ lookup_name_fuzzy (tree name, enum lookup_name_fuzzy_kind kind, location_t loc)
const char *header_hint
= get_cp_stdlib_header_for_name (IDENTIFIER_POINTER (name));
if (header_hint)
- return name_hint (NULL,
- new suggest_missing_header (loc,
- IDENTIFIER_POINTER (name),
- header_hint));
+ return name_hint
+ (nullptr,
+ std::make_unique<suggest_missing_header> (loc,
+ IDENTIFIER_POINTER (name),
+ header_hint));
best_match <tree, const char *> bm (name);
@@ -8934,9 +8943,27 @@ add_using_namespace (vec<tree, va_gc> *&usings, tree target)
if ((*usings)[ix] == target)
return;
+ if (modules_p ())
+ {
+ tree u = build_lang_decl (USING_DECL, NULL_TREE, NULL_TREE);
+ USING_DECL_DECLS (u) = target;
+ DECL_MODULE_EXPORT_P (u) = module_exporting_p ();
+ DECL_MODULE_PURVIEW_P (u) = module_purview_p ();
+ target = u;
+ }
vec_safe_push (usings, target);
}
+/* Convenience overload for the above, taking the user as its first
+ parameter. */
+
+void
+add_using_namespace (tree ns, tree target)
+{
+ add_using_namespace (NAMESPACE_LEVEL (ns)->using_directives,
+ ORIGINAL_NAMESPACE (target));
+}
+
/* Tell the debug system of a using directive. */
static void