blob: c4f76baa3933fbea2ba4b3d077c1e35ba4e37a53 [file] [log] [blame]
// RUN: rm -rf %t
// RUN: mkdir %t
// RUN: split-file --leading-lines %s %t
// RUN: %clang_cc1 -std=c++20 -pedantic-errors -fexceptions -fcxx-exceptions %t/cwg1884_A.cppm -triple x86_64-unknown-unknown -emit-module-interface -o %t/cwg1884_A.pcm
// RUN: %clang_cc1 -std=c++20 -verify=since-cxx20 -pedantic-errors -fexceptions -fcxx-exceptions -triple x86_64-unknown-unknown %t/cwg1884.cpp -fmodule-file=cwg1884_A=%t/cwg1884_A.pcm
// RUN: %clang_cc1 -std=c++23 -pedantic-errors -fexceptions -fcxx-exceptions %t/cwg1884_A.cppm -triple x86_64-unknown-unknown -emit-module-interface -o %t/cwg1884_A.pcm
// RUN: %clang_cc1 -std=c++23 -verify=since-cxx20 -pedantic-errors -fexceptions -fcxx-exceptions -triple x86_64-unknown-unknown %t/cwg1884.cpp -fmodule-file=cwg1884_A=%t/cwg1884_A.pcm
// RUN: %clang_cc1 -std=c++2c -pedantic-errors -fexceptions -fcxx-exceptions %t/cwg1884_A.cppm -triple x86_64-unknown-unknown -emit-module-interface -o %t/cwg1884_A.pcm
// RUN: %clang_cc1 -std=c++2c -verify=since-cxx20 -pedantic-errors -fexceptions -fcxx-exceptions -triple x86_64-unknown-unknown %t/cwg1884.cpp -fmodule-file=cwg1884_A=%t/cwg1884_A.pcm
// cwg1884: partial
// Cases b11, e11, g3, g4 are problematic, but we handle the other 101 cases fine.
// _N4993_.[basic.link]/11:
// For any two declarations of an entity E:
// — If one declares E to be a variable or function,
// the other shall declare E as one of the same type.
// — If one declares E to be an enumerator, the other shall do so.
// — If one declares E to be a namespace, the other shall do so.
// — If one declares E to be a type,
// the other shall declare E to be a type of the same kind (9.2.9.5).
// — If one declares E to be a class template,
// the other shall do so with the same kind and an equivalent template-head (13.7.7.2).
// [Note 5 : The declarations can supply different default template arguments. — end note]
// — If one declares E to be a function template or a (partial specialization of a) variable template,
// the other shall declare E to be one with an equivalent template-head and type.
// — If one declares E to be an alias template,
// the other shall declare E to be one with an equivalent template-head and defining-type-id.
// — If one declares E to be a concept, the other shall do so.
// Types are compared after all adjustments of types (during which typedefs (9.2.4) are replaced by their definitions);
// declarations for an array object can specify array types that differ by the presence or absence of a major array bound (9.3.4.5).
// No diagnostic is required if neither declaration is reachable from the other.
// The structure of the test is the following. First, module cwg1884_A
// provides all (significant) kinds of entities, each named 'a' through 'h', and copies of them.
// Then the .cpp file does MxN kind of testing, where it tests one kind of entity against every other kind.
//--- cwg1884_A.cppm
export module cwg1884_A;
export {
int a1;
int a2;
int a3;
int a4;
int a5;
int a6;
int a7;
int a8;
int a9;
int a10;
int a11;
void b1();
void b2();
void b3();
void b4();
void b5();
void b6();
void b7();
void b8();
void b9();
void b10();
void b11();
enum E {
c1,
c2,
c3,
c4,
c5,
c6,
c7,
c8,
c9,
c10
};
namespace d1 {}
namespace d2 {}
namespace d3 {}
namespace d4 {}
namespace d5 {}
namespace d6 {}
namespace d7 {}
namespace d8 {}
namespace d9 {}
namespace d10 {}
struct e1;
struct e2;
struct e3;
struct e4;
struct e5;
struct e6;
struct e7;
struct e8;
struct e9;
struct e10;
struct e11;
struct e12;
struct e13;
template <typename>
class f1;
template <typename>
class f2;
template <typename>
class f3;
template <typename>
class f4;
template <typename>
class f5;
template <typename>
class f6;
template <typename>
class f7;
template <typename>
class f8;
template <typename>
class f9;
template <typename>
class f10;
template <typename>
class f11;
template <typename>
void g1(int);
template <typename>
void g2(int);
template <typename>
void g3(int);
template <typename>
void g4(int);
template <typename>
void g5(int);
template <typename>
void g6(int);
template <typename>
void g7(int);
template <typename>
void g8(int);
template <typename>
void g9(int);
template <typename>
void g10(int);
template <typename, typename>
int h1;
template <typename, typename>
int h2;
template <typename, typename>
int h3;
template <typename, typename>
int h4;
template <typename, typename>
int h5;
template <typename, typename>
int h6;
template <typename, typename>
int h7;
template <typename, typename>
int h8;
template <typename, typename>
int h9;
template <typename, typename>
int h10;
template <typename>
using i1 = int;
template <typename>
using i2 = int;
template <typename>
using i3 = int;
template <typename>
using i4 = int;
template <typename>
using i5 = int;
template <typename>
using i6 = int;
template <typename>
using i7 = int;
template <typename>
using i8 = int;
template <typename>
using i9 = int;
template <typename>
using i10 = int;
template <typename>
using i11 = int;
template <typename>
concept j1 = true;
template <typename>
concept j2 = true;
template <typename>
concept j3 = true;
template <typename>
concept j4 = true;
template <typename>
concept j5 = true;
template <typename>
concept j6 = true;
template <typename>
concept j7 = true;
template <typename>
concept j8 = true;
template <typename>
concept j9 = true;
template <typename>
concept j10 = true;
template <typename>
concept j11 = true;
} // export
//--- cwg1884.cpp
import cwg1884_A;
// FIXME: we don't diagnose several cases we should be. They are marked with MISSING prefix.
// Part A: matching against `int a;`
// ---------------------------------
void a1();
// since-cxx20-error@-1 {{redefinition of 'a1' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:42 {{previous definition is here}}
enum Ea {
a2
// since-cxx20-error@-1 {{redefinition of 'a2'}}
// since-cxx20-note@cwg1884_A.cppm:43 {{previous definition is here}}
};
namespace a3 {}
// since-cxx20-error@-1 {{redefinition of 'a3' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:44 {{previous definition is here}}
struct a4;
// @-1 OK, types and variables do not correspond
template <typename>
class a5;
// since-cxx20-error@-1 {{redefinition of 'a5' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:46 {{previous definition is here}}
template <typename>
void a6(int);
// since-cxx20-error@-1 {{redefinition of 'a6' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:47 {{previous definition is here}}
template <typename, typename>
int a7;
// since-cxx20-error@-1 {{redefinition of 'a7' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:48 {{previous definition is here}}
template <typename T>
int a8<T, int>;
// since-cxx20-error@-1 {{redefinition of 'a8' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:49 {{previous definition is here}}
// since-cxx20-error@-3 {{expected ';' after top level declarator}}
template <typename>
using a9 = int;
// since-cxx20-error@-1 {{redefinition of 'a9' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:50 {{previous definition is here}}
template <typename>
concept a10 = true;
// since-cxx20-error@-1 {{redefinition of 'a10' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:51 {{previous definition is here}}
// For variables, type has to match as well.
long a11;
// since-cxx20-error@-1 {{redefinition of 'a11' with a different type: 'long' vs 'int'}}
// since-cxx20-note@cwg1884_A.cppm:52 {{previous definition is here}}
// Part B: matching against `void b();`
// ------------------------------------
int b1;
// since-cxx20-error@-1 {{redefinition of 'b1' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:53 {{previous definition is here}}
enum Eb {
b2
// since-cxx20-error@-1 {{redefinition of 'b2'}}
// since-cxx20-note@cwg1884_A.cppm:54 {{previous definition is here}}
};
namespace b3 {} // #cwg1884-namespace-b
// since-cxx20-error@-1 {{redefinition of 'b3' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:55 {{previous definition is here}}
struct b4;
// @-1 OK, types and functions do not correspond
template <typename>
class b5;
// since-cxx20-error@-1 {{redefinition of 'b5' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:57 {{previous definition is here}}
template <typename>
void b6(int);
// @-1 OK, a non-corresponding overload
template <typename, typename>
int b7;
// since-cxx20-error@-1 {{redefinition of 'b7' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:59 {{previous definition is here}}
template <typename T>
int b8<T, int>;
// since-cxx20-error@-1 {{no variable template matches partial specialization}}
template <typename>
using b9 = int;
// since-cxx20-error@-1 {{redefinition of 'b9' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:61 {{previous definition is here}}
template <typename>
concept b10 = true;
// since-cxx20-error@-1 {{redefinition of 'b10' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:62 {{previous definition is here}}
// For functions, type has to match as well.
// FIXME: we should be loud and clear here about type mismatch, like we do in `a11` case.
int b11();
// since-cxx20-error@-1 {{declaration of 'b11' in the global module follows declaration in module cwg1884_A}}
// since-cxx20-note@cwg1884_A.cppm:63 {{previous declaration is here}}
// Part C: matching against `enum E { c };`
// ----------------------------------------
int c1;
// since-cxx20-error@-1 {{redefinition of 'c1' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:65 {{previous definition is here}}
void c2();
// since-cxx20-error@-1 {{redefinition of 'c2' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:66 {{previous definition is here}}
namespace c3 {}
// since-cxx20-error@-1 {{redefinition of 'c3' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:67 {{previous definition is here}}
struct c4;
// @-1 OK, types and enumerators do not correspond
template <typename>
class c5;
// since-cxx20-error@-1 {{redefinition of 'c5' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:69 {{previous definition is here}}
template <typename>
void c6(int);
// since-cxx20-error@-1 {{redefinition of 'c6' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:70 {{previous definition is here}}
template <typename, typename>
int c7;
// since-cxx20-error@-1 {{redefinition of 'c7' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:71 {{previous definition is here}}
template <typename T>
int c8<T, int>;
// since-cxx20-error@-1 {{redefinition of 'c8' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:72 {{previous definition is here}}
// since-cxx20-error@-3 {{expected ';' after top level declarator}}
template <typename>
using c9 = int;
// since-cxx20-error@-1 {{redefinition of 'c9' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:73 {{previous definition is here}}
template <typename>
concept c10 = true;
// since-cxx20-error@-1 {{redefinition of 'c10' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:74 {{previous definition is here}}
// Part D: matching against `namespace d {};`
// ------------------------------------------
int d1;
// since-cxx20-error@-1 {{redefinition of 'd1' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:76 {{previous definition is here}}
void d2();
// since-cxx20-error@-1 {{redefinition of 'd2' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:77 {{previous definition is here}}
enum Ed {
d3
// since-cxx20-error@-1 {{redefinition of 'd3'}}
// since-cxx20-note@cwg1884_A.cppm:78 {{previous definition is here}}
};
struct d4;
// since-cxx20-error@-1 {{redefinition of 'd4' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:79 {{previous definition is here}}
template <typename>
class d5;
// since-cxx20-error@-1 {{redefinition of 'd5' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:80 {{previous definition is here}}
template <typename>
void d6(int);
// since-cxx20-error@-1 {{redefinition of 'd6' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:81 {{previous definition is here}}
template <typename, typename>
int d7;
// since-cxx20-error@-1 {{redefinition of 'd7' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:82 {{previous definition is here}}
template <typename T>
int d8<T, int>;
// since-cxx20-error@-1 {{redefinition of 'd8' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:83 {{previous definition is here}}
// since-cxx20-error@-3 {{expected ';' after top level declarator}}
template <typename>
using d9 = int;
// since-cxx20-error@-1 {{redefinition of 'd9' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:84 {{previous definition is here}}
template <typename>
concept d10 = true;
// since-cxx20-error@-1 {{redefinition of 'd10' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:85 {{previous definition is here}}
// Part E: matching against `struct e;`
// ------------------------------------
int e1;
// @-1 OK, types and variables do not correspond
void e2();
// @-1 OK, types and functions do not correspond
enum Ee {
e3
// @-1 OK, types and enumerators do not correspond
};
namespace e4 {}
// since-cxx20-error@-1 {{redefinition of 'e4' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:89 {{previous definition is here}}
template <typename>
class e5;
// since-cxx20-error@-1 {{redefinition of 'e5' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:90 {{previous definition is here}}
template <typename>
void e6(int);
// @-1 OK, types and function templates do not correspond
template <typename, typename>
int e7;
// since-cxx20-error@-1 {{redefinition of 'e7' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:92 {{previous definition is here}}
template <typename T>
int e8<T, int>;
// since-cxx20-error@-1 {{redefinition of 'e8' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:93 {{previous definition is here}}
// since-cxx20-error@-3 {{expected ';' after top level declarator}}
template <typename>
using e9 = int;
// since-cxx20-error@-1 {{redefinition of 'e9' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:94 {{previous definition is here}}
template <typename>
concept e10 = true;
// since-cxx20-error@-1 {{redefinition of 'e10' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:95 {{previous definition is here}}
// FIXME: the following forward declaration is well-formed.
// Agreement on 'struct' vs 'class' is not required per [dcl.type.elab]/7.
class e11;
// since-cxx20-error@-1 {{declaration of 'e11' in the global module follows declaration in module cwg1884_A}}
// since-cxx20-note@cwg1884_A.cppm:96 {{previous declaration is here}}
union e12;
// since-cxx20-error@-1 {{use of 'e12' with tag type that does not match previous declaration}}
// since-cxx20-note@cwg1884_A.cppm:97 {{previous use is here}}
// since-cxx20-error@-3 {{declaration of 'e12' in the global module follows declaration in module cwg1884_A}}
// since-cxx20-note@cwg1884_A.cppm:97 {{previous declaration is here}}
enum e13 {};
// since-cxx20-error@-1 {{use of 'e13' with tag type that does not match previous declaration}}
// since-cxx20-note@cwg1884_A.cppm:98 {{previous use is here}}
// Part F: matching against `template <typename> class f;`
// -------------------------------------------------------
int f1;
// since-cxx20-error@-1 {{redefinition of 'f1' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:100 {{previous definition is here}}
void f2();
// since-cxx20-error@-1 {{redefinition of 'f2' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:102 {{previous definition is here}}
enum Ef {
f3
// since-cxx20-error@-1 {{redefinition of 'f3'}}
// since-cxx20-note@cwg1884_A.cppm:104 {{previous definition is here}}
};
namespace f4 {}
// since-cxx20-error@-1 {{redefinition of 'f4' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:106 {{previous definition is here}}
struct f5;
// since-cxx20-error@-1 {{redefinition of 'f5' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:108 {{previous definition is here}}
template <typename>
void f6(int);
// since-cxx20-error@-1 {{redefinition of 'f6' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:110 {{previous definition is here}}
template <typename, typename>
int f7;
// since-cxx20-error@-1 {{redefinition of 'f7' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:112 {{previous definition is here}}
template <typename T>
int f8<T, int>;
// since-cxx20-error@-1 {{no variable template matches partial specialization}}
template <typename>
using f9 = int;
// since-cxx20-error@-1 {{redefinition of 'f9' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:116 {{previous definition is here}}
template <typename>
concept f10 = true;
// since-cxx20-error@-1 {{redefinition of 'f10' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:118 {{previous definition is here}}
// Part G: matching against `template <typename> void g(int);`
// -----------------------------------------------------------
int g1;
// since-cxx20-error@-1 {{redefinition of 'g1' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:122 {{previous definition is here}}
void g2();
// @-1 OK, a non-corresponding overload
enum Eg {
g3
// MISSING-since-cxx20-error@-1 {{redefinition of 'g3'}}
// MISSING-since-cxx20-note@cwg1884_A.cppm:126 {{previous definition is here}}
};
namespace g4 {}
// MISSING-since-cxx20-error@-1 {{redefinition of 'g4' as different kind of symbol}}
// MISSING-since-cxx20-note@cwg1884_A.cppm:128 {{previous definition is here}}
struct g5;
// @-1 OK, types and function templates do not correspond
template <typename>
class g6;
// since-cxx20-error@-1 {{redefinition of 'g6' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:132 {{previous definition is here}}
template <typename, typename>
int g7;
// since-cxx20-error@-1 {{redefinition of 'g7' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:134 {{previous definition is here}}
template <typename T>
int g8<T, int>;
// since-cxx20-error@-1 {{no variable template matches specialization; did you mean to use 'g8' as function template instead?}}
template <typename>
using g9 = int;
// since-cxx20-error@-1 {{redefinition of 'g9' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:138 {{previous definition is here}}
template <typename>
concept g10 = true;
// since-cxx20-error@-1 {{redefinition of 'g10' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:140 {{previous definition is here}}
// Part H: matching against `template <typename, typename> int h;`
// ---------------------------------------------------------------
int h1;
// since-cxx20-error@-1 {{redefinition of 'h1' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:142 {{previous definition is here}}
void h2();
// since-cxx20-error@-1 {{redefinition of 'h2' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:144 {{previous definition is here}}
enum Eh {
h3
// since-cxx20-error@-1 {{redefinition of 'h3'}}
// since-cxx20-note@cwg1884_A.cppm:146 {{previous definition is here}}
};
namespace h4 {}
// since-cxx20-error@-1 {{redefinition of 'h4' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:148 {{previous definition is here}}
struct h5;
// since-cxx20-error@-1 {{redefinition of 'h5' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:150 {{previous definition is here}}
template <typename>
class h6;
// since-cxx20-error@-1 {{redefinition of 'h6' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:152 {{previous definition is here}}
template <typename>
void h7(int);
// since-cxx20-error@-1 {{redefinition of 'h7' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:154 {{previous definition is here}}
template <typename T>
int h8<T, int>;
// @-1 OK, partial specialization
template <typename>
using h9 = int;
// since-cxx20-error@-1 {{redefinition of 'h9' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:158 {{previous definition is here}}
template <typename>
concept h10 = true;
// since-cxx20-error@-1 {{redefinition of 'h10' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:160 {{previous definition is here}}
// Part I: matching against `template <typename> using i = int;`
// -------------------------------------------------------------
int i1;
// since-cxx20-error@-1 {{redefinition of 'i1' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:162 {{previous definition is here}}
void i2();
// since-cxx20-error@-1 {{redefinition of 'i2' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:164 {{previous definition is here}}
enum Ei {
i3
// since-cxx20-error@-1 {{redefinition of 'i3'}}
// since-cxx20-note@cwg1884_A.cppm:166 {{previous definition is here}}
};
namespace i4 {}
// since-cxx20-error@-1 {{redefinition of 'i4' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:168 {{previous definition is here}}
struct i5;
// since-cxx20-error@-1 {{redefinition of 'i5' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:170 {{previous definition is here}}
template <typename>
class i6;
// since-cxx20-error@-1 {{redefinition of 'i6' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:172 {{previous definition is here}}
template <typename>
void i7(int);
// since-cxx20-error@-1 {{redefinition of 'i7' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:174 {{previous definition is here}}
template <typename, typename>
int i8;
// since-cxx20-error@-1 {{redefinition of 'i8' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:176 {{previous definition is here}}
template <typename T>
int i9<T, int>;
// since-cxx20-error@-1 {{no variable template matches partial specialization}}
template <typename>
concept i10 = true;
// since-cxx20-error@-1 {{redefinition of 'i10' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:180 {{previous definition is here}}
// Part J: matching against `template <typename> concept j = true;`
// ----------------------------------------------------------------
int j1;
// since-cxx20-error@-1 {{redefinition of 'j1' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:184 {{previous definition is here}}
void j2();
// since-cxx20-error@-1 {{redefinition of 'j2' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:186 {{previous definition is here}}
enum Ej {
j3
// since-cxx20-error@-1 {{redefinition of 'j3'}}
// since-cxx20-note@cwg1884_A.cppm:188 {{previous definition is here}}
};
namespace j4 {}
// since-cxx20-error@-1 {{redefinition of 'j4' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:190 {{previous definition is here}}
struct j5;
// since-cxx20-error@-1 {{redefinition of 'j5' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:192 {{previous definition is here}}
template <typename>
class j6;
// since-cxx20-error@-1 {{redefinition of 'j6' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:194 {{previous definition is here}}
template <typename>
void j7(int);
// since-cxx20-error@-1 {{redefinition of 'j7' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:196 {{previous definition is here}}
template <typename, typename>
int j8;
// since-cxx20-error@-1 {{redefinition of 'j8' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:198 {{previous definition is here}}
template <typename T>
int j9<T, int>;
// since-cxx20-error@-1 {{no variable template matches partial specialization}}
template <typename>
using j10 = int;
// since-cxx20-error@-1 {{redefinition of 'j10' as different kind of symbol}}
// since-cxx20-note@cwg1884_A.cppm:202 {{previous definition is here}}