[C++20] [Modules] Only diagnose the non-inline external variable
authorChuanqi Xu <yedeng.yd@linux.alibaba.com>
Tue, 17 Jan 2023 09:26:48 +0000 (17:26 +0800)
committerChuanqi Xu <yedeng.yd@linux.alibaba.com>
Tue, 17 Jan 2023 09:48:09 +0000 (17:48 +0800)
definitions in header units

Address part of https://github.com/llvm/llvm-project/issues/60079.

Since the the declaration of a non-inline static data member in its
class definition is not a definition. The following form:

```
class A {
public:
    static const int value = 43;
};
```

should be fine to appear in a header unit. From the perspective of
implementation, it looks like we simply forgot to check if the variable
is a definition...

Reviewed By: iains

Differential Revision: https://reviews.llvm.org/D141905

clang/lib/Sema/SemaDecl.cpp
clang/test/CXX/module/module.import/p6.cpp

index e3fd404..baadaf3 100644 (file)
@@ -13088,6 +13088,7 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, bool DirectInit) {
   // C++ [module.import/6] external definitions are not permitted in header
   // units.
   if (getLangOpts().CPlusPlusModules && currentModuleIsHeaderUnit() &&
+      VDecl->isThisDeclarationADefinition() &&
       VDecl->getFormalLinkage() == Linkage::ExternalLinkage &&
       !VDecl->isInline()) {
     Diag(VDecl->getLocation(), diag::err_extern_def_in_header_unit);
index 25c1950..7d86327 100644 (file)
@@ -22,3 +22,9 @@ int ok_var_decl;
 
 int bad_var_definition = 3;  // expected-error {{non-inline external definitions are not permitted in C++ header units}}
 
+class A {
+public:
+    // This is a declaration instead of definition.
+    static const int value = 43; 
+};
+