diff options
Diffstat (limited to 'test/CXX/basic/basic.link/p8.cpp')
-rw-r--r-- | test/CXX/basic/basic.link/p8.cpp | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/test/CXX/basic/basic.link/p8.cpp b/test/CXX/basic/basic.link/p8.cpp new file mode 100644 index 000000000000..54b977d77f68 --- /dev/null +++ b/test/CXX/basic/basic.link/p8.cpp @@ -0,0 +1,78 @@ +// RUN: %clang_cc1 -std=c++2a -verify %s -pedantic + +template<typename T> struct Template {}; + +struct Linkage1 { struct Inner {}; }; +typedef struct { struct Inner {}; } Linkage2; + +typedef struct {} const NoLinkage1; +auto x = [] {}; +typedef decltype(x) NoLinkage2; +auto f() { return [] {}; } +typedef decltype(f()) NoLinkage3; + +inline auto g() { return [] {}; } +typedef decltype(g()) VisibleNoLinkage1; +inline auto y = [] {}; +typedef decltype(y) VisibleNoLinkage2; +inline auto h() { struct {} x; return x; } +typedef decltype(h()) VisibleNoLinkage3; + +extern Linkage1 linkage1v; +extern Linkage1::Inner linkage1iv; +extern Linkage2 linkage2v; +extern Linkage2::Inner linkage2iv; +extern Template<Linkage1> linkaget1v; +extern Linkage1 linkage1f(); +void linkage2f(Linkage2); + +void use_linkage() { + &linkage1v, &linkage1iv, &linkage2v, &linkage2iv, &linkaget1v; // expected-warning 5{{unused}} + linkage1f(); + linkage2f({}); +} + +extern NoLinkage1 no_linkage1(); // expected-error {{function 'no_linkage1' is used but not defined in this translation unit}} +extern NoLinkage2 no_linkage2(); // expected-error {{function 'no_linkage2' is used but not defined in this translation unit}} +extern NoLinkage3 no_linkage3(); // expected-error {{function 'no_linkage3' is used but not defined in this translation unit}} + +void use_no_linkage() { + no_linkage1(); // expected-note {{used here}} + no_linkage2(); // expected-note {{used here}} + no_linkage3(); // expected-note {{used here}} +} + +extern VisibleNoLinkage1 visible_no_linkage1(); // expected-warning {{ISO C++ requires a definition}} +extern VisibleNoLinkage2 visible_no_linkage2(); // expected-warning {{ISO C++ requires a definition}} +extern VisibleNoLinkage3 visible_no_linkage3(); // expected-warning {{ISO C++ requires a definition}} + +void use_visible_no_linkage() { + visible_no_linkage1(); // expected-note {{used here}} + visible_no_linkage2(); // expected-note {{used here}} + visible_no_linkage3(); // expected-note {{used here}} +} + +namespace { + struct InternalLinkage {}; +} +InternalLinkage internal_linkage(); // expected-error {{used but not defined}} +void use_internal_linkage() { + internal_linkage(); // expected-note {{used here}} +} + +extern inline int not_defined; // expected-error {{not defined}} +extern inline int defined_after_use; +void use_inline_vars() { + not_defined = 1; // expected-note {{used here}} + defined_after_use = 2; +} +inline int defined_after_use; + +namespace { + template<typename T> struct A { + static const int n; + }; + template<typename T> const int A<T>::n = 3; + static_assert(A<int>::n == 3); + int k = A<float>::n; +} |