Skip to content
Merged
6 changes: 4 additions & 2 deletions clang/lib/Serialization/ASTWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6227,8 +6227,10 @@ void ASTWriter::WriteDeclUpdatesBlocks(ASTContext &Context,
// Add a trailing update record, if any. These must go last because we
// lazily load their attached statement.
if (!GeneratingReducedBMI || !CanElideDeclDef(D)) {
if (HasUpdatedBody) {
const auto *Def = cast<FunctionDecl>(D);
assert(!(HasUpdatedBody && HasAddedVarDefinition) &&
"Declaration can not be both a FunctionDecl and a VarDecl");
if (const auto *Def = dyn_cast<FunctionDecl>(D);
HasUpdatedBody && Def->doesThisDeclarationHaveABody()) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Logically, it looks better to not set HasUpdatedBody if the declaration doesn't have a body.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changed as suggested.

Record.push_back(UPD_CXX_ADDED_FUNCTION_DEFINITION);
Record.push_back(Def->isInlined());
Record.AddSourceLocation(Def->getInnerLocStart());
Expand Down
42 changes: 42 additions & 0 deletions clang/test/Modules/missing-body-in-import.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
// RUN: rm -rf %t
// RUN: split-file %s %t
// RUN: cd %t

// RUN: %clang_cc1 -std=c++23 mod1.cppm -emit-module-interface -o mod1.pcm -fallow-pcm-with-compiler-errors -verify
// RUN: %clang_cc1 -std=c++23 mod2.cppm -emit-module-interface -o mod2.pcm -fmodule-file=mod1=mod1.pcm -verify -fallow-pcm-with-compiler-errors
// RUN: %clang_cc1 -std=c++23 mod3.cppm -emit-module-interface -o mod3.pcm -fmodule-file=mod1=mod1.pcm -fmodule-file=mod2=mod2.pcm -verify -fallow-pcm-with-compiler-errors
// RUN: %clang_cc1 -std=c++23 main.cpp -fmodule-file=mod1=mod1.pcm -fmodule-file=mod2=mod2.pcm -fmodule-file=mod3=mod3.pcm -verify -fallow-pcm-with-compiler-errors -ast-dump-all

//--- mod1.cppm
export module mod1;

export template <unsigned N, unsigned M>
class A {
public:
constexpr A(const char[], const char[]) {
auto x = BrokenExpr; // expected-error {{use of undeclared identifier 'BrokenExpr'}}
}
};

export template<A<1,1> NTTP>
struct B {};

template < unsigned N, unsigned M >
A(const char (&)[N], const char (&)[M]) -> A< 1, 1 >;

//--- mod2.cppm
export module mod2;
import mod1;

struct C: B <A{"a", "b"}> { // expected-error {{non-type template argument is not a constant expression}}
constexpr C(int a) { }
};

//--- mod3.cppm
// expected-no-diagnostics
export module mod3;
export import mod2;

//--- main.cpp
// expected-no-diagnostics
import mod3; // no crash
Loading