brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.6 KiB · e348562 Raw
79 lines · cpp
1// RUN: %clang_cc1 -std=c++2a -verify %s -pedantic2 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 4{{left operand of comma operator has no effect}} expected-warning {{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