Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / clang / test / CXX / basic / basic.link / p8.cpp
blobe348562c2eee25cb08f4af18ee6e248e0a7ac94d
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;
9 auto x = [] {};
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);
29 void use_linkage() {
30 &linkage1v, &linkage1iv, &linkage2v, &linkage2iv, &linkaget1v; // expected-warning 4{{left operand of comma operator has no effect}} expected-warning {{unused}}
31 linkage1f();
32 linkage2f({});
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}}
55 namespace {
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;
71 namespace {
72 template<typename T> struct A {
73 static const int n;
75 template<typename T> const int A<T>::n = 3;
76 static_assert(A<int>::n == 3);
77 int k = A<float>::n;