1 //===- Lookup.h - Classes for name lookup -----------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file defines the LookupResult class, which is integral to 10 // Sema's name-lookup subsystem. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_CLANG_SEMA_LOOKUP_H 15 #define LLVM_CLANG_SEMA_LOOKUP_H 16 17 #include "clang/AST/Decl.h" 18 #include "clang/AST/DeclBase.h" 19 #include "clang/AST/DeclCXX.h" 20 #include "clang/AST/DeclarationName.h" 21 #include "clang/AST/Type.h" 22 #include "clang/AST/UnresolvedSet.h" 23 #include "clang/Basic/LLVM.h" 24 #include "clang/Basic/LangOptions.h" 25 #include "clang/Basic/SourceLocation.h" 26 #include "clang/Basic/Specifiers.h" 27 #include "clang/Sema/Sema.h" 28 #include "llvm/ADT/MapVector.h" 29 #include "llvm/ADT/STLExtras.h" 30 #include "llvm/Support/Casting.h" 31 #include <cassert> 32 #include <optional> 33 #include <utility> 34 35 namespace clang { 36 37 class CXXBasePaths; 38 39 /// Represents the results of name lookup. 40 /// 41 /// An instance of the LookupResult class captures the results of a 42 /// single name lookup, which can return no result (nothing found), 43 /// a single declaration, a set of overloaded functions, or an 44 /// ambiguity. Use the getKind() method to determine which of these 45 /// results occurred for a given lookup. 46 class LookupResult { 47 public: 48 enum LookupResultKind { 49 /// No entity found met the criteria. 50 NotFound = 0, 51 52 /// No entity found met the criteria within the current 53 /// instantiation,, but there were dependent base classes of the 54 /// current instantiation that could not be searched. 55 NotFoundInCurrentInstantiation, 56 57 /// Name lookup found a single declaration that met the 58 /// criteria. getFoundDecl() will return this declaration. 59 Found, 60 61 /// Name lookup found a set of overloaded functions that 62 /// met the criteria. 63 FoundOverloaded, 64 65 /// Name lookup found an unresolvable value declaration 66 /// and cannot yet complete. This only happens in C++ dependent 67 /// contexts with dependent using declarations. 68 FoundUnresolvedValue, 69 70 /// Name lookup results in an ambiguity; use 71 /// getAmbiguityKind to figure out what kind of ambiguity 72 /// we have. 73 Ambiguous 74 }; 75 76 enum AmbiguityKind { 77 /// Name lookup results in an ambiguity because multiple 78 /// entities that meet the lookup criteria were found in 79 /// subobjects of different types. For example: 80 /// @code 81 /// struct A { void f(int); } 82 /// struct B { void f(double); } 83 /// struct C : A, B { }; 84 /// void test(C c) { 85 /// c.f(0); // error: A::f and B::f come from subobjects of different 86 /// // types. overload resolution is not performed. 87 /// } 88 /// @endcode 89 AmbiguousBaseSubobjectTypes, 90 91 /// Name lookup results in an ambiguity because multiple 92 /// nonstatic entities that meet the lookup criteria were found 93 /// in different subobjects of the same type. For example: 94 /// @code 95 /// struct A { int x; }; 96 /// struct B : A { }; 97 /// struct C : A { }; 98 /// struct D : B, C { }; 99 /// int test(D d) { 100 /// return d.x; // error: 'x' is found in two A subobjects (of B and C) 101 /// } 102 /// @endcode 103 AmbiguousBaseSubobjects, 104 105 /// Name lookup results in an ambiguity because multiple definitions 106 /// of entity that meet the lookup criteria were found in different 107 /// declaration contexts. 108 /// @code 109 /// namespace A { 110 /// int i; 111 /// namespace B { int i; } 112 /// int test() { 113 /// using namespace B; 114 /// return i; // error 'i' is found in namespace A and A::B 115 /// } 116 /// } 117 /// @endcode 118 AmbiguousReference, 119 120 /// Name lookup results in an ambiguity because multiple placeholder 121 /// variables were found in the same scope. 122 /// @code 123 /// void f() { 124 /// int _ = 0; 125 /// int _ = 0; 126 /// return _; // ambiguous use of placeholder variable 127 /// } 128 /// @endcode 129 AmbiguousReferenceToPlaceholderVariable, 130 131 /// Name lookup results in an ambiguity because an entity with a 132 /// tag name was hidden by an entity with an ordinary name from 133 /// a different context. 134 /// @code 135 /// namespace A { struct Foo {}; } 136 /// namespace B { void Foo(); } 137 /// namespace C { 138 /// using namespace A; 139 /// using namespace B; 140 /// } 141 /// void test() { 142 /// C::Foo(); // error: tag 'A::Foo' is hidden by an object in a 143 /// // different namespace 144 /// } 145 /// @endcode 146 AmbiguousTagHiding 147 }; 148 149 /// A little identifier for flagging temporary lookup results. 150 enum TemporaryToken { 151 Temporary 152 }; 153 154 using iterator = UnresolvedSetImpl::iterator; 155 156 LookupResult( 157 Sema &SemaRef, const DeclarationNameInfo &NameInfo, 158 Sema::LookupNameKind LookupKind, 159 RedeclarationKind Redecl = RedeclarationKind::NotForRedeclaration) 160 : SemaPtr(&SemaRef), NameInfo(NameInfo), LookupKind(LookupKind), 161 Redecl(Redecl != RedeclarationKind::NotForRedeclaration), 162 ExternalRedecl(Redecl == RedeclarationKind::ForExternalRedeclaration), 163 DiagnoseAccess(Redecl == RedeclarationKind::NotForRedeclaration), 164 DiagnoseAmbiguous(Redecl == RedeclarationKind::NotForRedeclaration) { 165 configure(); 166 } 167 168 // TODO: consider whether this constructor should be restricted to take 169 // as input a const IdentifierInfo* (instead of Name), 170 // forcing other cases towards the constructor taking a DNInfo. 171 LookupResult( 172 Sema &SemaRef, DeclarationName Name, SourceLocation NameLoc, 173 Sema::LookupNameKind LookupKind, 174 RedeclarationKind Redecl = RedeclarationKind::NotForRedeclaration) 175 : SemaPtr(&SemaRef), NameInfo(Name, NameLoc), LookupKind(LookupKind), 176 Redecl(Redecl != RedeclarationKind::NotForRedeclaration), 177 ExternalRedecl(Redecl == RedeclarationKind::ForExternalRedeclaration), 178 DiagnoseAccess(Redecl == RedeclarationKind::NotForRedeclaration), 179 DiagnoseAmbiguous(Redecl == RedeclarationKind::NotForRedeclaration) { 180 configure(); 181 } 182 183 /// Creates a temporary lookup result, initializing its core data 184 /// using the information from another result. Diagnostics are always 185 /// disabled. LookupResult(TemporaryToken _,const LookupResult & Other)186 LookupResult(TemporaryToken _, const LookupResult &Other) 187 : SemaPtr(Other.SemaPtr), NameInfo(Other.NameInfo), 188 LookupKind(Other.LookupKind), IDNS(Other.IDNS), Redecl(Other.Redecl), 189 ExternalRedecl(Other.ExternalRedecl), HideTags(Other.HideTags), 190 AllowHidden(Other.AllowHidden), 191 TemplateNameLookup(Other.TemplateNameLookup) {} 192 193 // FIXME: Remove these deleted methods once the default build includes 194 // -Wdeprecated. 195 LookupResult(const LookupResult &) = delete; 196 LookupResult &operator=(const LookupResult &) = delete; 197 LookupResult(LookupResult && Other)198 LookupResult(LookupResult &&Other) 199 : ResultKind(std::move(Other.ResultKind)), 200 Ambiguity(std::move(Other.Ambiguity)), Decls(std::move(Other.Decls)), 201 Paths(std::move(Other.Paths)), 202 NamingClass(std::move(Other.NamingClass)), 203 BaseObjectType(std::move(Other.BaseObjectType)), 204 SemaPtr(std::move(Other.SemaPtr)), NameInfo(std::move(Other.NameInfo)), 205 NameContextRange(std::move(Other.NameContextRange)), 206 LookupKind(std::move(Other.LookupKind)), IDNS(std::move(Other.IDNS)), 207 Redecl(std::move(Other.Redecl)), 208 ExternalRedecl(std::move(Other.ExternalRedecl)), 209 HideTags(std::move(Other.HideTags)), 210 DiagnoseAccess(std::move(Other.DiagnoseAccess)), 211 DiagnoseAmbiguous(std::move(Other.DiagnoseAmbiguous)), 212 AllowHidden(std::move(Other.AllowHidden)), 213 Shadowed(std::move(Other.Shadowed)), 214 TemplateNameLookup(std::move(Other.TemplateNameLookup)) { 215 Other.Paths = nullptr; 216 Other.DiagnoseAccess = false; 217 Other.DiagnoseAmbiguous = false; 218 } 219 220 LookupResult &operator=(LookupResult &&Other) { 221 ResultKind = std::move(Other.ResultKind); 222 Ambiguity = std::move(Other.Ambiguity); 223 Decls = std::move(Other.Decls); 224 Paths = std::move(Other.Paths); 225 NamingClass = std::move(Other.NamingClass); 226 BaseObjectType = std::move(Other.BaseObjectType); 227 SemaPtr = std::move(Other.SemaPtr); 228 NameInfo = std::move(Other.NameInfo); 229 NameContextRange = std::move(Other.NameContextRange); 230 LookupKind = std::move(Other.LookupKind); 231 IDNS = std::move(Other.IDNS); 232 Redecl = std::move(Other.Redecl); 233 ExternalRedecl = std::move(Other.ExternalRedecl); 234 HideTags = std::move(Other.HideTags); 235 DiagnoseAccess = std::move(Other.DiagnoseAccess); 236 DiagnoseAmbiguous = std::move(Other.DiagnoseAmbiguous); 237 AllowHidden = std::move(Other.AllowHidden); 238 Shadowed = std::move(Other.Shadowed); 239 TemplateNameLookup = std::move(Other.TemplateNameLookup); 240 Other.Paths = nullptr; 241 Other.DiagnoseAccess = false; 242 Other.DiagnoseAmbiguous = false; 243 return *this; 244 } 245 ~LookupResult()246 ~LookupResult() { 247 if (DiagnoseAccess) 248 diagnoseAccess(); 249 if (DiagnoseAmbiguous) 250 diagnoseAmbiguous(); 251 if (Paths) deletePaths(Paths); 252 } 253 254 /// Gets the name info to look up. getLookupNameInfo()255 const DeclarationNameInfo &getLookupNameInfo() const { 256 return NameInfo; 257 } 258 259 /// Sets the name info to look up. setLookupNameInfo(const DeclarationNameInfo & NameInfo)260 void setLookupNameInfo(const DeclarationNameInfo &NameInfo) { 261 this->NameInfo = NameInfo; 262 } 263 264 /// Gets the name to look up. getLookupName()265 DeclarationName getLookupName() const { 266 return NameInfo.getName(); 267 } 268 269 /// Sets the name to look up. setLookupName(DeclarationName Name)270 void setLookupName(DeclarationName Name) { 271 NameInfo.setName(Name); 272 } 273 274 /// Gets the kind of lookup to perform. getLookupKind()275 Sema::LookupNameKind getLookupKind() const { 276 return LookupKind; 277 } 278 279 /// True if this lookup is just looking for an existing declaration. isForRedeclaration()280 bool isForRedeclaration() const { 281 return Redecl; 282 } 283 284 /// True if this lookup is just looking for an existing declaration to link 285 /// against a declaration with external linkage. isForExternalRedeclaration()286 bool isForExternalRedeclaration() const { 287 return ExternalRedecl; 288 } 289 redeclarationKind()290 RedeclarationKind redeclarationKind() const { 291 return ExternalRedecl ? RedeclarationKind::ForExternalRedeclaration 292 : Redecl ? RedeclarationKind::ForVisibleRedeclaration 293 : RedeclarationKind::NotForRedeclaration; 294 } 295 296 /// Specify whether hidden declarations are visible, e.g., 297 /// for recovery reasons. setAllowHidden(bool AH)298 void setAllowHidden(bool AH) { 299 AllowHidden = AH; 300 } 301 302 /// Determine whether this lookup is permitted to see hidden 303 /// declarations, such as those in modules that have not yet been imported. isHiddenDeclarationVisible(NamedDecl * ND)304 bool isHiddenDeclarationVisible(NamedDecl *ND) const { 305 return AllowHidden || 306 (isForExternalRedeclaration() && ND->isExternallyDeclarable()); 307 } 308 309 /// Sets whether tag declarations should be hidden by non-tag 310 /// declarations during resolution. The default is true. setHideTags(bool Hide)311 void setHideTags(bool Hide) { 312 HideTags = Hide; 313 } 314 315 /// Sets whether this is a template-name lookup. For template-name lookups, 316 /// injected-class-names are treated as naming a template rather than a 317 /// template specialization. setTemplateNameLookup(bool TemplateName)318 void setTemplateNameLookup(bool TemplateName) { 319 TemplateNameLookup = TemplateName; 320 } 321 isTemplateNameLookup()322 bool isTemplateNameLookup() const { return TemplateNameLookup; } 323 isAmbiguous()324 bool isAmbiguous() const { 325 return getResultKind() == Ambiguous; 326 } 327 328 /// Determines if this names a single result which is not an 329 /// unresolved value using decl. If so, it is safe to call 330 /// getFoundDecl(). isSingleResult()331 bool isSingleResult() const { 332 return getResultKind() == Found; 333 } 334 335 /// Determines if the results are overloaded. isOverloadedResult()336 bool isOverloadedResult() const { 337 return getResultKind() == FoundOverloaded; 338 } 339 isUnresolvableResult()340 bool isUnresolvableResult() const { 341 return getResultKind() == FoundUnresolvedValue; 342 } 343 getResultKind()344 LookupResultKind getResultKind() const { 345 assert(checkDebugAssumptions()); 346 return ResultKind; 347 } 348 getAmbiguityKind()349 AmbiguityKind getAmbiguityKind() const { 350 assert(isAmbiguous()); 351 return Ambiguity; 352 } 353 asUnresolvedSet()354 const UnresolvedSetImpl &asUnresolvedSet() const { 355 return Decls; 356 } 357 begin()358 iterator begin() const { return iterator(Decls.begin()); } end()359 iterator end() const { return iterator(Decls.end()); } 360 361 /// Return true if no decls were found empty()362 bool empty() const { return Decls.empty(); } 363 364 /// Return the base paths structure that's associated with 365 /// these results, or null if none is. getBasePaths()366 CXXBasePaths *getBasePaths() const { 367 return Paths; 368 } 369 370 /// Determine whether the given declaration is visible to the 371 /// program. 372 static bool isVisible(Sema &SemaRef, NamedDecl *D); 373 374 static bool isReachable(Sema &SemaRef, NamedDecl *D); 375 isAcceptable(Sema & SemaRef,NamedDecl * D,Sema::AcceptableKind Kind)376 static bool isAcceptable(Sema &SemaRef, NamedDecl *D, 377 Sema::AcceptableKind Kind) { 378 return Kind == Sema::AcceptableKind::Visible ? isVisible(SemaRef, D) 379 : isReachable(SemaRef, D); 380 } 381 382 /// Determine whether this lookup is permitted to see the declaration. 383 /// Note that a reachable but not visible declaration inhabiting a namespace 384 /// is not allowed to be seen during name lookup. 385 /// 386 /// For example: 387 /// ``` 388 /// // m.cppm 389 /// export module m; 390 /// struct reachable { int v; } 391 /// export auto func() { return reachable{43}; } 392 /// // Use.cpp 393 /// import m; 394 /// auto Use() { 395 /// // Not valid. We couldn't see reachable here. 396 /// // So isAvailableForLookup would return false when we look 397 /// up 'reachable' here. 398 /// // return reachable(43).v; 399 /// // Valid. The field name 'v' is allowed during name lookup. 400 /// // So isAvailableForLookup would return true when we look up 'v' here. 401 /// return func().v; 402 /// } 403 /// ``` 404 static bool isAvailableForLookup(Sema &SemaRef, NamedDecl *ND); 405 406 /// Retrieve the accepted (re)declaration of the given declaration, 407 /// if there is one. getAcceptableDecl(NamedDecl * D)408 NamedDecl *getAcceptableDecl(NamedDecl *D) const { 409 if (!D->isInIdentifierNamespace(IDNS)) 410 return nullptr; 411 412 if (isAvailableForLookup(getSema(), D) || isHiddenDeclarationVisible(D)) 413 return D; 414 415 return getAcceptableDeclSlow(D); 416 } 417 418 private: 419 static bool isAcceptableSlow(Sema &SemaRef, NamedDecl *D, 420 Sema::AcceptableKind Kind); 421 static bool isReachableSlow(Sema &SemaRef, NamedDecl *D); 422 NamedDecl *getAcceptableDeclSlow(NamedDecl *D) const; 423 424 public: 425 /// Returns the identifier namespace mask for this lookup. getIdentifierNamespace()426 unsigned getIdentifierNamespace() const { 427 return IDNS; 428 } 429 430 /// Returns whether these results arose from performing a 431 /// lookup into a class. isClassLookup()432 bool isClassLookup() const { 433 return NamingClass != nullptr; 434 } 435 436 /// Returns the 'naming class' for this lookup, i.e. the 437 /// class which was looked into to find these results. 438 /// 439 /// C++0x [class.access.base]p5: 440 /// The access to a member is affected by the class in which the 441 /// member is named. This naming class is the class in which the 442 /// member name was looked up and found. [Note: this class can be 443 /// explicit, e.g., when a qualified-id is used, or implicit, 444 /// e.g., when a class member access operator (5.2.5) is used 445 /// (including cases where an implicit "this->" is added). If both 446 /// a class member access operator and a qualified-id are used to 447 /// name the member (as in p->T::m), the class naming the member 448 /// is the class named by the nested-name-specifier of the 449 /// qualified-id (that is, T). -- end note ] 450 /// 451 /// This is set by the lookup routines when they find results in a class. getNamingClass()452 CXXRecordDecl *getNamingClass() const { 453 return NamingClass; 454 } 455 456 /// Sets the 'naming class' for this lookup. setNamingClass(CXXRecordDecl * Record)457 void setNamingClass(CXXRecordDecl *Record) { 458 NamingClass = Record; 459 } 460 461 /// Returns the base object type associated with this lookup; 462 /// important for [class.protected]. Most lookups do not have an 463 /// associated base object. getBaseObjectType()464 QualType getBaseObjectType() const { 465 return BaseObjectType; 466 } 467 468 /// Sets the base object type for this lookup. setBaseObjectType(QualType T)469 void setBaseObjectType(QualType T) { 470 BaseObjectType = T; 471 } 472 473 /// Add a declaration to these results with its natural access. 474 /// Does not test the acceptance criteria. addDecl(NamedDecl * D)475 void addDecl(NamedDecl *D) { 476 addDecl(D, D->getAccess()); 477 } 478 479 /// Add a declaration to these results with the given access. 480 /// Does not test the acceptance criteria. addDecl(NamedDecl * D,AccessSpecifier AS)481 void addDecl(NamedDecl *D, AccessSpecifier AS) { 482 Decls.addDecl(D, AS); 483 ResultKind = Found; 484 } 485 486 /// Add all the declarations from another set of lookup 487 /// results. addAllDecls(const LookupResult & Other)488 void addAllDecls(const LookupResult &Other) { 489 Decls.append(Other.Decls.begin(), Other.Decls.end()); 490 ResultKind = Found; 491 } 492 493 /// Determine whether no result was found because we could not 494 /// search into dependent base classes of the current instantiation. wasNotFoundInCurrentInstantiation()495 bool wasNotFoundInCurrentInstantiation() const { 496 return ResultKind == NotFoundInCurrentInstantiation; 497 } 498 499 /// Note that while no result was found in the current instantiation, 500 /// there were dependent base classes that could not be searched. setNotFoundInCurrentInstantiation()501 void setNotFoundInCurrentInstantiation() { 502 assert((ResultKind == NotFound || 503 ResultKind == NotFoundInCurrentInstantiation) && 504 Decls.empty()); 505 ResultKind = NotFoundInCurrentInstantiation; 506 } 507 508 /// Determine whether the lookup result was shadowed by some other 509 /// declaration that lookup ignored. isShadowed()510 bool isShadowed() const { return Shadowed; } 511 512 /// Note that we found and ignored a declaration while performing 513 /// lookup. setShadowed()514 void setShadowed() { Shadowed = true; } 515 516 /// Resolves the result kind of the lookup, possibly hiding 517 /// decls. 518 /// 519 /// This should be called in any environment where lookup might 520 /// generate multiple lookup results. 521 void resolveKind(); 522 523 /// Re-resolves the result kind of the lookup after a set of 524 /// removals has been performed. resolveKindAfterFilter()525 void resolveKindAfterFilter() { 526 if (Decls.empty()) { 527 if (ResultKind != NotFoundInCurrentInstantiation) 528 ResultKind = NotFound; 529 530 if (Paths) { 531 deletePaths(Paths); 532 Paths = nullptr; 533 } 534 } else { 535 std::optional<AmbiguityKind> SavedAK; 536 bool WasAmbiguous = false; 537 if (ResultKind == Ambiguous) { 538 SavedAK = Ambiguity; 539 WasAmbiguous = true; 540 } 541 ResultKind = Found; 542 resolveKind(); 543 544 // If we didn't make the lookup unambiguous, restore the old 545 // ambiguity kind. 546 if (ResultKind == Ambiguous) { 547 (void)WasAmbiguous; 548 assert(WasAmbiguous); 549 Ambiguity = *SavedAK; 550 } else if (Paths) { 551 deletePaths(Paths); 552 Paths = nullptr; 553 } 554 } 555 } 556 557 template <class DeclClass> getAsSingle()558 DeclClass *getAsSingle() const { 559 if (getResultKind() != Found) return nullptr; 560 return dyn_cast<DeclClass>(getFoundDecl()); 561 } 562 563 /// Fetch the unique decl found by this lookup. Asserts 564 /// that one was found. 565 /// 566 /// This is intended for users who have examined the result kind 567 /// and are certain that there is only one result. getFoundDecl()568 NamedDecl *getFoundDecl() const { 569 assert(getResultKind() == Found 570 && "getFoundDecl called on non-unique result"); 571 return (*begin())->getUnderlyingDecl(); 572 } 573 574 /// Fetches a representative decl. Useful for lazy diagnostics. getRepresentativeDecl()575 NamedDecl *getRepresentativeDecl() const { 576 assert(!Decls.empty() && "cannot get representative of empty set"); 577 return *begin(); 578 } 579 580 /// Asks if the result is a single tag decl. isSingleTagDecl()581 bool isSingleTagDecl() const { 582 return getResultKind() == Found && isa<TagDecl>(getFoundDecl()); 583 } 584 585 /// Make these results show that the name was found in 586 /// base classes of different types. 587 /// 588 /// The given paths object is copied and invalidated. 589 void setAmbiguousBaseSubobjectTypes(CXXBasePaths &P); 590 591 /// Make these results show that the name was found in 592 /// distinct base classes of the same type. 593 /// 594 /// The given paths object is copied and invalidated. 595 void setAmbiguousBaseSubobjects(CXXBasePaths &P); 596 597 /// Make these results show that the name was found in 598 /// different contexts and a tag decl was hidden by an ordinary 599 /// decl in a different context. setAmbiguousQualifiedTagHiding()600 void setAmbiguousQualifiedTagHiding() { 601 setAmbiguous(AmbiguousTagHiding); 602 } 603 604 /// Clears out any current state. clear()605 LLVM_ATTRIBUTE_REINITIALIZES void clear() { 606 ResultKind = NotFound; 607 Decls.clear(); 608 if (Paths) deletePaths(Paths); 609 Paths = nullptr; 610 NamingClass = nullptr; 611 Shadowed = false; 612 } 613 614 /// Clears out any current state and re-initializes for a 615 /// different kind of lookup. clear(Sema::LookupNameKind Kind)616 void clear(Sema::LookupNameKind Kind) { 617 clear(); 618 LookupKind = Kind; 619 configure(); 620 } 621 622 /// Change this lookup's redeclaration kind. setRedeclarationKind(RedeclarationKind RK)623 void setRedeclarationKind(RedeclarationKind RK) { 624 Redecl = (RK != RedeclarationKind::NotForRedeclaration); 625 ExternalRedecl = (RK == RedeclarationKind::ForExternalRedeclaration); 626 configure(); 627 } 628 629 void dump(); 630 void print(raw_ostream &); 631 632 /// Suppress the diagnostics that would normally fire because of this 633 /// lookup. This happens during (e.g.) redeclaration lookups. suppressDiagnostics()634 void suppressDiagnostics() { 635 DiagnoseAccess = false; 636 DiagnoseAmbiguous = false; 637 } 638 639 /// Suppress the diagnostics that would normally fire because of this 640 /// lookup due to access control violations. suppressAccessDiagnostics()641 void suppressAccessDiagnostics() { DiagnoseAccess = false; } 642 643 /// Determines whether this lookup is suppressing access control diagnostics. isSuppressingAccessDiagnostics()644 bool isSuppressingAccessDiagnostics() const { return !DiagnoseAccess; } 645 646 /// Determines whether this lookup is suppressing ambiguous lookup 647 /// diagnostics. isSuppressingAmbiguousDiagnostics()648 bool isSuppressingAmbiguousDiagnostics() const { return !DiagnoseAmbiguous; } 649 650 /// Sets a 'context' source range. setContextRange(SourceRange SR)651 void setContextRange(SourceRange SR) { 652 NameContextRange = SR; 653 } 654 655 /// Gets the source range of the context of this name; for C++ 656 /// qualified lookups, this is the source range of the scope 657 /// specifier. getContextRange()658 SourceRange getContextRange() const { 659 return NameContextRange; 660 } 661 662 /// Gets the location of the identifier. This isn't always defined: 663 /// sometimes we're doing lookups on synthesized names. getNameLoc()664 SourceLocation getNameLoc() const { 665 return NameInfo.getLoc(); 666 } 667 668 /// Get the Sema object that this lookup result is searching 669 /// with. getSema()670 Sema &getSema() const { return *SemaPtr; } 671 672 /// A class for iterating through a result set and possibly 673 /// filtering out results. The results returned are possibly 674 /// sugared. 675 class Filter { 676 friend class LookupResult; 677 678 LookupResult &Results; 679 LookupResult::iterator I; 680 bool Changed = false; 681 bool CalledDone = false; 682 Filter(LookupResult & Results)683 Filter(LookupResult &Results) : Results(Results), I(Results.begin()) {} 684 685 public: Filter(Filter && F)686 Filter(Filter &&F) 687 : Results(F.Results), I(F.I), Changed(F.Changed), 688 CalledDone(F.CalledDone) { 689 F.CalledDone = true; 690 } 691 692 // The move assignment operator is defined as deleted pending 693 // further motivation. 694 Filter &operator=(Filter &&) = delete; 695 696 // The copy constrcutor and copy assignment operator is defined as deleted 697 // pending further motivation. 698 Filter(const Filter &) = delete; 699 Filter &operator=(const Filter &) = delete; 700 ~Filter()701 ~Filter() { 702 assert(CalledDone && 703 "LookupResult::Filter destroyed without done() call"); 704 } 705 hasNext()706 bool hasNext() const { 707 return I != Results.end(); 708 } 709 next()710 NamedDecl *next() { 711 assert(I != Results.end() && "next() called on empty filter"); 712 return *I++; 713 } 714 715 /// Restart the iteration. restart()716 void restart() { 717 I = Results.begin(); 718 } 719 720 /// Erase the last element returned from this iterator. erase()721 void erase() { 722 Results.Decls.erase(--I); 723 Changed = true; 724 } 725 726 /// Replaces the current entry with the given one, preserving the 727 /// access bits. replace(NamedDecl * D)728 void replace(NamedDecl *D) { 729 Results.Decls.replace(I-1, D); 730 Changed = true; 731 } 732 733 /// Replaces the current entry with the given one. replace(NamedDecl * D,AccessSpecifier AS)734 void replace(NamedDecl *D, AccessSpecifier AS) { 735 Results.Decls.replace(I-1, D, AS); 736 Changed = true; 737 } 738 done()739 void done() { 740 assert(!CalledDone && "done() called twice"); 741 CalledDone = true; 742 743 if (Changed) 744 Results.resolveKindAfterFilter(); 745 } 746 }; 747 748 /// Create a filter for this result set. makeFilter()749 Filter makeFilter() { 750 return Filter(*this); 751 } 752 setFindLocalExtern(bool FindLocalExtern)753 void setFindLocalExtern(bool FindLocalExtern) { 754 if (FindLocalExtern) 755 IDNS |= Decl::IDNS_LocalExtern; 756 else 757 IDNS &= ~Decl::IDNS_LocalExtern; 758 } 759 760 private: diagnoseAccess()761 void diagnoseAccess() { 762 if (!isAmbiguous() && isClassLookup() && 763 getSema().getLangOpts().AccessControl) 764 getSema().CheckLookupAccess(*this); 765 } 766 diagnoseAmbiguous()767 void diagnoseAmbiguous() { 768 if (isAmbiguous()) 769 getSema().DiagnoseAmbiguousLookup(*this); 770 } 771 setAmbiguous(AmbiguityKind AK)772 void setAmbiguous(AmbiguityKind AK) { 773 ResultKind = Ambiguous; 774 Ambiguity = AK; 775 } 776 777 void addDeclsFromBasePaths(const CXXBasePaths &P); 778 void configure(); 779 780 bool checkDebugAssumptions() const; 781 checkUnresolved()782 bool checkUnresolved() const { 783 for (iterator I = begin(), E = end(); I != E; ++I) 784 if (isa<UnresolvedUsingValueDecl>((*I)->getUnderlyingDecl())) 785 return true; 786 return false; 787 } 788 789 static void deletePaths(CXXBasePaths *); 790 791 // Results. 792 LookupResultKind ResultKind = NotFound; 793 // ill-defined unless ambiguous. Still need to be initialized it will be 794 // copied/moved. 795 AmbiguityKind Ambiguity = {}; 796 UnresolvedSet<8> Decls; 797 CXXBasePaths *Paths = nullptr; 798 CXXRecordDecl *NamingClass = nullptr; 799 QualType BaseObjectType; 800 801 // Parameters. 802 Sema *SemaPtr; 803 DeclarationNameInfo NameInfo; 804 SourceRange NameContextRange; 805 Sema::LookupNameKind LookupKind; 806 unsigned IDNS = 0; // set by configure() 807 808 bool Redecl; 809 bool ExternalRedecl; 810 811 /// True if tag declarations should be hidden if non-tags 812 /// are present 813 bool HideTags = true; 814 815 bool DiagnoseAccess = false; 816 bool DiagnoseAmbiguous = false; 817 818 /// True if we should allow hidden declarations to be 'visible'. 819 bool AllowHidden = false; 820 821 /// True if the found declarations were shadowed by some other 822 /// declaration that we skipped. This only happens when \c LookupKind 823 /// is \c LookupRedeclarationWithLinkage. 824 bool Shadowed = false; 825 826 /// True if we're looking up a template-name. 827 bool TemplateNameLookup = false; 828 }; 829 830 /// Consumes visible declarations found when searching for 831 /// all visible names within a given scope or context. 832 /// 833 /// This abstract class is meant to be subclassed by clients of \c 834 /// Sema::LookupVisibleDecls(), each of which should override the \c 835 /// FoundDecl() function to process declarations as they are found. 836 class VisibleDeclConsumer { 837 public: 838 /// Destroys the visible declaration consumer. 839 virtual ~VisibleDeclConsumer(); 840 841 /// Determine whether hidden declarations (from unimported 842 /// modules) should be given to this consumer. By default, they 843 /// are not included. 844 virtual bool includeHiddenDecls() const; 845 846 /// Invoked each time \p Sema::LookupVisibleDecls() finds a 847 /// declaration visible from the current scope or context. 848 /// 849 /// \param ND the declaration found. 850 /// 851 /// \param Hiding a declaration that hides the declaration \p ND, 852 /// or NULL if no such declaration exists. 853 /// 854 /// \param Ctx the original context from which the lookup started. 855 /// 856 /// \param InBaseClass whether this declaration was found in base 857 /// class of the context we searched. 858 virtual void FoundDecl(NamedDecl *ND, NamedDecl *Hiding, DeclContext *Ctx, 859 bool InBaseClass) = 0; 860 861 /// Callback to inform the client that Sema entered into a new context 862 /// to find a visible declaration. 863 // 864 /// \param Ctx the context which Sema entered. EnteredContext(DeclContext * Ctx)865 virtual void EnteredContext(DeclContext *Ctx) {} 866 }; 867 868 /// A class for storing results from argument-dependent lookup. 869 class ADLResult { 870 private: 871 /// A map from canonical decls to the 'most recent' decl. 872 llvm::MapVector<NamedDecl*, NamedDecl*> Decls; 873 874 struct select_second { operatorselect_second875 NamedDecl *operator()(std::pair<NamedDecl*, NamedDecl*> P) const { 876 return P.second; 877 } 878 }; 879 880 public: 881 /// Adds a new ADL candidate to this map. 882 void insert(NamedDecl *D); 883 884 /// Removes any data associated with a given decl. erase(NamedDecl * D)885 void erase(NamedDecl *D) { 886 Decls.erase(cast<NamedDecl>(D->getCanonicalDecl())); 887 } 888 889 using iterator = 890 llvm::mapped_iterator<decltype(Decls)::iterator, select_second>; 891 begin()892 iterator begin() { return iterator(Decls.begin(), select_second()); } end()893 iterator end() { return iterator(Decls.end(), select_second()); } 894 }; 895 896 } // namespace clang 897 898 #endif // LLVM_CLANG_SEMA_LOOKUP_H 899