
This adjusts the handling for: export module M; export namespace {}; export namespace N {}; export using namespace N; In the first case, we were allowing empty anonymous namespaces as part of an extension allowing empty top-level entities, but that seems inappropriate in this case, since the linkage would be internal for the anonymous namespace. We now report an error for this. The second case was producing a warning diagnostic that this was accepted as an extension - however the C++20 standard does allow this as well-formed. In the third case we keep the current practice that this is accepted with a warning (as an extension). The C++20 standard says it's an error. We also ensure that using decls are only applied to items with external linkage. This adjusts error messages for exports involving redeclarations in modules to be more specific about the reason that the decl has been rejected. Differential Revision: https://reviews.llvm.org/D122119
32 lines
1.1 KiB
C++
32 lines
1.1 KiB
C++
// Based on C++20 10.2 example 1.
|
|
|
|
// RUN: rm -rf %t
|
|
// RUN: mkdir -p %t
|
|
// RUN: split-file %s %t
|
|
|
|
// RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/std-10-2-ex1-tu1.cpp \
|
|
// RUN: -pedantic-errors -verify -o %t/m1.pcm
|
|
|
|
//--- std-10-2-ex1.h
|
|
export int x;
|
|
|
|
//--- std-10-2-ex1-tu1.cpp
|
|
module;
|
|
|
|
#include "std-10-2-ex1.h"
|
|
// expected-error@std-10-2-ex1.h:* {{export declaration can only be used within a module interface unit after the module declaration}}
|
|
|
|
export module M1;
|
|
export namespace {} // expected-error {{declaration does not introduce any names to be exported}}
|
|
export namespace {
|
|
int a1; // expected-error {{declaration of 'a1' with internal linkage cannot be exported}}
|
|
}
|
|
namespace { // expected-note {{anonymous namespace begins here}}
|
|
export int a2; // expected-error {{export declaration appears within anonymous namespace}}
|
|
}
|
|
export static int b; // expected-error {{declaration of 'b' with internal linkage cannot be exported}}
|
|
export int f(); // OK
|
|
|
|
export namespace N {} // namespace N
|
|
export using namespace N; // expected-error {{ISO C++20 does not permit using directive to be exported}}
|