Skip to content

Commit

Permalink
[AST] lookup in parent DeclContext for transparent DeclContext
Browse files Browse the repository at this point in the history
The compiler would crash if we lookup for name in transparent decl
context. See the tests attached for example.

I think this should make sense since the member declared in transparent
DeclContext are semantically defined in the enclosing (non-transparent)
DeclContext, this is the definition for transparent DeclContext.

Reviewed By: erichkeane

Differential Revision: https://reviews.llvm.org/D116792
  • Loading branch information
ChuanqiXu9 committed Jan 11, 2022
1 parent 9ef2175 commit d9d63fc
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 3 deletions.
6 changes: 3 additions & 3 deletions clang/lib/AST/DeclBase.cpp
Expand Up @@ -1644,9 +1644,9 @@ void DeclContext::buildLookupImpl(DeclContext *DCtx, bool Internal) {

DeclContext::lookup_result
DeclContext::lookup(DeclarationName Name) const {
assert(getDeclKind() != Decl::LinkageSpec &&
getDeclKind() != Decl::Export &&
"should not perform lookups into transparent contexts");
// For transparent DeclContext, we should lookup in their enclosing context.
if (getDeclKind() == Decl::LinkageSpec || getDeclKind() == Decl::Export)
return getParent()->lookup(Name);

const DeclContext *PrimaryContext = getPrimaryContext();
if (PrimaryContext != this)
Expand Down
3 changes: 3 additions & 0 deletions clang/test/Modules/Inputs/template_name_lookup/foo.cppm
@@ -0,0 +1,3 @@
export module foo;
export template <typename T>
class X {};
11 changes: 11 additions & 0 deletions clang/test/Modules/template_name_lookup.cpp
@@ -0,0 +1,11 @@
// RUN: rm -rf %t
// RUN: mkdir -p %t
// RUN: %clang_cc1 -std=c++20 %S/Inputs/template_name_lookup/foo.cppm -emit-module-interface -o %t/foo.pcm
// RUN: %clang_cc1 -std=c++20 -fprebuilt-module-path=%t %s -fsyntax-only -verify

import foo;
void use() {
X x; // expected-error {{no viable constructor or deduction guide for deduction of template arguments of 'X'}}
// expected-note@Inputs/template_name_lookup/foo.cppm:3 {{candidate template ignored: couldn't infer template argument 'T'}}
// expected-note@Inputs/template_name_lookup/foo.cppm:3 {{candidate function template not viable: requires 1 argument, but 0 were provided}}
}
12 changes: 12 additions & 0 deletions clang/test/SemaCXX/lookup-template-name-extern-CXX.cpp
@@ -0,0 +1,12 @@
// Tests that the lookup in transparent declaration context
// (linkage specifiaction context) wouldn't cause compiler crash.
// RUN: %clang_cc1 -std=c++20 %s -fsyntax-only -verify
extern "C++" {
template <class T>
class X {}; // expected-note {{candidate template ignored: couldn't infer template argument 'T'}}
// expected-note@-1 {{candidate function template not viable: requires 1 argument, but 0 were provided}}
}

void foo() {
X x; // expected-error {{no viable constructor or deduction guide for deduction of template arguments of 'X'}}
}

0 comments on commit d9d63fc

Please sign in to comment.