Skip to content

Commit

Permalink
[C++20] [Modules] Only diagnose the non-inline external variable
Browse files Browse the repository at this point in the history
definitions in header units

Address part of #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
  • Loading branch information
ChuanqiXu9 committed Jan 17, 2023
1 parent 546b710 commit b3eb004
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 0 deletions.
1 change: 1 addition & 0 deletions clang/lib/Sema/SemaDecl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
6 changes: 6 additions & 0 deletions clang/test/CXX/module/module.import/p6.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};

0 comments on commit b3eb004

Please sign in to comment.