[PATCH] D118120: [C++20] [Modules] Only check decls under namespace scope in CheckRedeclarationExported
Chuanqi Xu via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Jan 25 18:56:08 PST 2022
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG5c1f7b296ac0: [C++20] [Modules] Only check decls under namespace scope in… (authored by ChuanqiXu).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D118120/new/
https://reviews.llvm.org/D118120
Files:
clang/lib/Sema/SemaDecl.cpp
clang/test/CXX/module/module.interface/p6.cpp
Index: clang/test/CXX/module/module.interface/p6.cpp
===================================================================
--- clang/test/CXX/module/module.interface/p6.cpp
+++ clang/test/CXX/module/module.interface/p6.cpp
@@ -91,3 +91,24 @@
T TemplVar; // expected-note {{previous declaration is here}}
export template <typename T>
T TemplVar; // expected-error {{cannot export redeclaration 'TemplVar' here since the previous declaration is not exported}}
+
+// Test the compiler wouldn't complain about the redeclaration of friend in exported class.
+namespace Friend {
+template <typename T>
+class bar;
+class gua;
+template <typename T>
+void hello();
+void hi();
+export class foo;
+bool operator<(const foo &a, const foo &b);
+export class foo {
+ template <typename T>
+ friend class bar;
+ friend class gua;
+ template <typename T>
+ friend void hello();
+ friend void hi();
+ friend bool operator<(const foo &a, const foo &b);
+};
+} // namespace Friend
Index: clang/lib/Sema/SemaDecl.cpp
===================================================================
--- clang/lib/Sema/SemaDecl.cpp
+++ clang/lib/Sema/SemaDecl.cpp
@@ -1635,6 +1635,19 @@
// A redeclaration of an entity X is implicitly exported if X was introduced by
// an exported declaration; otherwise it shall not be exported.
bool Sema::CheckRedeclarationExported(NamedDecl *New, NamedDecl *Old) {
+ // [module.interface]p1:
+ // An export-declaration shall inhabit a namespace scope.
+ //
+ // So it is meaningless to talk about redeclaration which is not at namespace
+ // scope.
+ if (!New->getLexicalDeclContext()
+ ->getNonTransparentContext()
+ ->isFileContext() ||
+ !Old->getLexicalDeclContext()
+ ->getNonTransparentContext()
+ ->isFileContext())
+ return false;
+
bool IsNewExported = New->isInExportDeclContext();
bool IsOldExported = Old->isInExportDeclContext();
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D118120.403110.patch
Type: text/x-patch
Size: 1922 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220126/f0c5232c/attachment.bin>
More information about the cfe-commits
mailing list