// 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; } |