[PATCH] D142704: [C++20][Modules] Handle template declarations in header units.
Iain Sandoe via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Jan 31 03:12:03 PST 2023
iains updated this revision to Diff 493546.
iains marked 2 inline comments as done.
iains added a comment.
rebased, added tests for instantiated variable/function templates.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D142704/new/
https://reviews.llvm.org/D142704
Files:
clang/lib/Sema/SemaDecl.cpp
clang/test/CXX/module/module.import/p6.cpp
Index: clang/test/CXX/module/module.import/p6.cpp
===================================================================
--- clang/test/CXX/module/module.import/p6.cpp
+++ clang/test/CXX/module/module.import/p6.cpp
@@ -22,6 +22,8 @@
int bad_var_definition = 3; // expected-error {{non-inline external definitions are not permitted in C++ header units}}
+/* The cases below should compile without diagnostics. */
+
class A {
public:
// This is a declaration instead of definition.
@@ -36,3 +38,32 @@
S(S&);
};
S::S(S&) = default;
+
+template <class _X>
+_X tmpl_var_ok_0 = static_cast<_X>(-1);
+
+template <typename _T>
+constexpr _T tmpl_var_ok_1 = static_cast<_T>(42);
+
+inline int a = tmpl_var_ok_1<int>;
+
+template <typename _Tp,
+ template <typename> class _T>
+constexpr int tmpl_var_ok_2 = _T<_Tp>::value ? 42 : 6174 ;
+
+template<class _Ep>
+int tmpl_OK (_Ep) { return 0; }
+
+template <class _T1>
+bool
+operator==(_T1& , _T1& ) { return false; }
+
+constexpr long one_k = 1000L;
+
+template <class ..._Args>
+void* tmpl_fn_ok
+(_Args ...__args) { return nullptr; }
+
+inline int foo (int a) {
+ return tmpl_OK (a);
+}
Index: clang/lib/Sema/SemaDecl.cpp
===================================================================
--- clang/lib/Sema/SemaDecl.cpp
+++ clang/lib/Sema/SemaDecl.cpp
@@ -13089,9 +13089,10 @@
// C++ [module.import/6] external definitions are not permitted in header
// units.
if (getLangOpts().CPlusPlusModules && currentModuleIsHeaderUnit() &&
- VDecl->isThisDeclarationADefinition() &&
+ !VDecl->isInvalidDecl() && VDecl->isThisDeclarationADefinition() &&
VDecl->getFormalLinkage() == Linkage::ExternalLinkage &&
- !VDecl->isInline()) {
+ !VDecl->isInline() && !VDecl->isTemplated() &&
+ !isa<VarTemplateSpecializationDecl>(VDecl)) {
Diag(VDecl->getLocation(), diag::err_extern_def_in_header_unit);
VDecl->setInvalidDecl();
}
@@ -15260,9 +15261,10 @@
// FIXME: Consider an alternate location for the test where the inlined()
// state is complete.
if (getLangOpts().CPlusPlusModules && currentModuleIsHeaderUnit() &&
+ !FD->isInvalidDecl() && !FD->isInlined() &&
+ BodyKind != FnBodyKind::Delete && BodyKind != FnBodyKind::Default &&
FD->getFormalLinkage() == Linkage::ExternalLinkage &&
- !FD->isInvalidDecl() && BodyKind != FnBodyKind::Delete &&
- BodyKind != FnBodyKind::Default && !FD->isInlined()) {
+ !FD->isTemplated() && !FD->isTemplateInstantiation()) {
assert(FD->isThisDeclarationADefinition());
Diag(FD->getLocation(), diag::err_extern_def_in_header_unit);
FD->setInvalidDecl();
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D142704.493546.patch
Type: text/x-patch
Size: 2657 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230131/32d4b5a1/attachment.bin>
More information about the cfe-commits
mailing list