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