Clang Project

clang_source_code/test/CXX/basic/basic.link/p8.cpp
1// RUN: %clang_cc1 -std=c++2a -verify %s -pedantic
2
3template<typename T> struct Template {};
4
5struct Linkage1 { struct Inner {}; };
6typedef struct { struct Inner {}; } Linkage2;
7
8typedef struct {} const NoLinkage1;
9auto x = [] {};
10typedef decltype(x) NoLinkage2;
11auto f() { return [] {}; }
12typedef decltype(f()) NoLinkage3;
13
14inline auto g() { return [] {}; }
15typedef decltype(g()) VisibleNoLinkage1;
16inline auto y = [] {};
17typedef decltype(y) VisibleNoLinkage2;
18inline auto h() { struct {} x; return x; }
19typedef decltype(h()) VisibleNoLinkage3;
20
21extern Linkage1 linkage1v;
22extern Linkage1::Inner linkage1iv;
23extern Linkage2 linkage2v;
24extern Linkage2::Inner linkage2iv;
25extern Template<Linkage1> linkaget1v;
26extern Linkage1 linkage1f();
27void linkage2f(Linkage2);
28
29void use_linkage() {
30  &linkage1v, &linkage1iv, &linkage2v, &linkage2iv, &linkaget1v; // expected-warning 5{{unused}}
31  linkage1f();
32  linkage2f({});
33}
34
35extern NoLinkage1 no_linkage1(); // expected-error {{function 'no_linkage1' is used but not defined in this translation unit}}
36extern NoLinkage2 no_linkage2(); // expected-error {{function 'no_linkage2' is used but not defined in this translation unit}}
37extern NoLinkage3 no_linkage3(); // expected-error {{function 'no_linkage3' is used but not defined in this translation unit}}
38
39void use_no_linkage() {
40  no_linkage1(); // expected-note {{used here}}
41  no_linkage2(); // expected-note {{used here}}
42  no_linkage3(); // expected-note {{used here}}
43}
44
45extern VisibleNoLinkage1 visible_no_linkage1(); // expected-warning {{ISO C++ requires a definition}}
46extern VisibleNoLinkage2 visible_no_linkage2(); // expected-warning {{ISO C++ requires a definition}}
47extern VisibleNoLinkage3 visible_no_linkage3(); // expected-warning {{ISO C++ requires a definition}}
48
49void 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}}
53}
54
55namespace {
56  struct InternalLinkage {};
57}
58InternalLinkage internal_linkage(); // expected-error {{used but not defined}}
59void use_internal_linkage() {
60  internal_linkage(); // expected-note {{used here}}
61}
62
63extern inline int not_defined; // expected-error {{not defined}}
64extern inline int defined_after_use;
65void use_inline_vars() {
66  not_defined = 1; // expected-note {{used here}}
67  defined_after_use = 2;
68}
69inline int defined_after_use;
70
71namespace {
72  template<typename T> struct A {
73    static const int n;
74  };
75  template<typename T> const int A<T>::n = 3;
76  static_assert(A<int>::n == 3);
77  int k = A<float>::n;
78}
79