1 // RUN: %clang_cc1 -std=c++2a -verify %s -pedantic
3 template<typename T
> struct Template
{};
5 struct Linkage1
{ struct Inner
{}; };
6 typedef struct { struct Inner
{}; } Linkage2
;
8 typedef struct {} const NoLinkage1
;
10 typedef decltype(x
) NoLinkage2
;
11 auto f() { return [] {}; }
12 typedef decltype(f()) NoLinkage3
;
14 inline auto g() { return [] {}; }
15 typedef decltype(g()) VisibleNoLinkage1
;
16 inline auto y
= [] {};
17 typedef decltype(y
) VisibleNoLinkage2
;
18 inline auto h() { struct {} x
; return x
; }
19 typedef decltype(h()) VisibleNoLinkage3
;
21 extern Linkage1 linkage1v
;
22 extern Linkage1::Inner linkage1iv
;
23 extern Linkage2 linkage2v
;
24 extern Linkage2::Inner linkage2iv
;
25 extern Template
<Linkage1
> linkaget1v
;
26 extern Linkage1
linkage1f();
27 void linkage2f(Linkage2
);
30 &linkage1v
, &linkage1iv
, &linkage2v
, &linkage2iv
, &linkaget1v
; // expected-warning 4{{left operand of comma operator has no effect}} expected-warning {{unused}}
35 extern NoLinkage1
no_linkage1(); // expected-error {{function 'no_linkage1' is used but not defined in this translation unit}}
36 extern NoLinkage2
no_linkage2(); // expected-error {{function 'no_linkage2' is used but not defined in this translation unit}}
37 extern NoLinkage3
no_linkage3(); // expected-error {{function 'no_linkage3' is used but not defined in this translation unit}}
39 void use_no_linkage() {
40 no_linkage1(); // expected-note {{used here}}
41 no_linkage2(); // expected-note {{used here}}
42 no_linkage3(); // expected-note {{used here}}
45 extern VisibleNoLinkage1
visible_no_linkage1(); // expected-warning {{ISO C++ requires a definition}}
46 extern VisibleNoLinkage2
visible_no_linkage2(); // expected-warning {{ISO C++ requires a definition}}
47 extern VisibleNoLinkage3
visible_no_linkage3(); // expected-warning {{ISO C++ requires a definition}}
49 void use_visible_no_linkage() {
50 visible_no_linkage1(); // expected-note {{used here}}
51 visible_no_linkage2(); // expected-note {{used here}}
52 visible_no_linkage3(); // expected-note {{used here}}
56 struct InternalLinkage
{};
58 InternalLinkage
internal_linkage(); // expected-error {{used but not defined}}
59 void use_internal_linkage() {
60 internal_linkage(); // expected-note {{used here}}
63 extern inline int not_defined
; // expected-error {{not defined}}
64 extern inline int defined_after_use
;
65 void use_inline_vars() {
66 not_defined
= 1; // expected-note {{used here}}
67 defined_after_use
= 2;
69 inline int defined_after_use
;
72 template<typename T
> struct A
{
75 template<typename T
> const int A
<T
>::n
= 3;
76 static_assert(A
<int>::n
== 3);