diff options
Diffstat (limited to 'contrib/llvm-project/clang/lib/Sema/IdentifierResolver.cpp')
-rw-r--r-- | contrib/llvm-project/clang/lib/Sema/IdentifierResolver.cpp | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/contrib/llvm-project/clang/lib/Sema/IdentifierResolver.cpp b/contrib/llvm-project/clang/lib/Sema/IdentifierResolver.cpp index 333f4d70986a..2213c3c83724 100644 --- a/contrib/llvm-project/clang/lib/Sema/IdentifierResolver.cpp +++ b/contrib/llvm-project/clang/lib/Sema/IdentifierResolver.cpp @@ -60,6 +60,9 @@ public: } } + IdDeclInfoMap(const IdDeclInfoMap &) = delete; + IdDeclInfoMap &operator=(const IdDeclInfoMap &) = delete; + /// Returns the IdDeclInfo associated to the DeclarationName. /// It creates a new IdDeclInfo if one was not created before for this id. IdDeclInfo &operator[](DeclarationName Name); @@ -99,10 +102,16 @@ IdentifierResolver::~IdentifierResolver() { bool IdentifierResolver::isDeclInScope(Decl *D, DeclContext *Ctx, Scope *S, bool AllowInlineNamespace) const { Ctx = Ctx->getRedeclContext(); - + // The names for HLSL cbuffer/tbuffers only used by the CPU-side + // reflection API which supports querying bindings. It will not have name + // conflict with other Decls. + if (LangOpt.HLSL && isa<HLSLBufferDecl>(D)) + return false; if (Ctx->isFunctionOrMethod() || (S && S->isFunctionPrototypeScope())) { // Ignore the scopes associated within transparent declaration contexts. - while (S->getEntity() && S->getEntity()->isTransparentContext()) + while (S->getEntity() && + (S->getEntity()->isTransparentContext() || + (!LangOpt.CPlusPlus && isa<RecordDecl>(S->getEntity())))) S = S->getParent(); if (S->isDeclScope(D)) @@ -121,12 +130,14 @@ bool IdentifierResolver::isDeclInScope(Decl *D, DeclContext *Ctx, Scope *S, // of the controlled statement. // assert(S->getParent() && "No TUScope?"); - if (S->getParent()->getFlags() & Scope::ControlScope) { + // If the current decl is in a lambda, we shouldn't consider this is a + // redefinition as lambda has its own scope. + if (S->getParent()->isControlScope() && !S->isFunctionScope()) { S = S->getParent(); if (S->isDeclScope(D)) return true; } - if (S->getFlags() & Scope::FnTryCatchScope) + if (S->isFnTryCatchScope()) return S->getParent()->isDeclScope(D); } return false; @@ -225,9 +236,12 @@ void IdentifierResolver::RemoveDecl(NamedDecl *D) { return toIdDeclInfo(Ptr)->RemoveDecl(D); } -/// begin - Returns an iterator for decls with name 'Name'. -IdentifierResolver::iterator -IdentifierResolver::begin(DeclarationName Name) { +llvm::iterator_range<IdentifierResolver::iterator> +IdentifierResolver::decls(DeclarationName Name) { + return {begin(Name), end()}; +} + +IdentifierResolver::iterator IdentifierResolver::begin(DeclarationName Name) { if (IdentifierInfo *II = Name.getAsIdentifierInfo()) readingIdentifier(*II); @@ -285,7 +299,7 @@ static DeclMatchKind compareDeclarations(NamedDecl *Existing, NamedDecl *New) { // If the existing declaration is somewhere in the previous declaration // chain of the new declaration, then prefer the new declaration. - for (auto RD : New->redecls()) { + for (auto *RD : New->redecls()) { if (RD == Existing) return DMK_Replace; |