Skip to content
Merged
7 changes: 4 additions & 3 deletions clang/lib/Serialization/ASTWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6092,9 +6092,10 @@ void ASTWriter::WriteDeclUpdatesBlocks(ASTContext &Context,

// An updated body is emitted last, so that the reader doesn't need
// to skip over the lazy body to reach statements for other records.
if (Kind == UPD_CXX_ADDED_FUNCTION_DEFINITION)
HasUpdatedBody = true;
else if (Kind == UPD_CXX_ADDED_VAR_DEFINITION)
if (Kind == UPD_CXX_ADDED_FUNCTION_DEFINITION) {
assert(isa<FunctionDecl>(D) && "expected FunctionDecl");
HasUpdatedBody = dyn_cast<FunctionDecl>(D)->hasBody();
} else if (Kind == UPD_CXX_ADDED_VAR_DEFINITION)
Copy link
Member

Choose a reason for hiding this comment

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

Suggested change
} else if (Kind == UPD_CXX_ADDED_VAR_DEFINITION)
} else if (Kind == UPD_CXX_ADDED_VAR_DEFINITION) {

Please see LLVM's policy for the use of { : https://llvm.org/docs/CodingStandards.html#don-t-use-braces-on-simple-single-statement-bodies-of-if-else-loop-statements

we hope the style is consistent with the if-else branches

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Added

HasAddedVarDefinition = true;
else
Copy link
Member

Choose a reason for hiding this comment

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

ditto,

Suggested change
else
else {

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Added

Record.push_back(Kind);
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