// RUN: %clang_cc1 -fsyntax-only -triple i686-pc-win32 -verify %s
// PR14993

namespace test1 {
  inline void f();  // expected-warning{{inline function 'test1::f' is not defined}}
  void test() { f(); }  // expected-note{{used here}}
}

namespace test2 {
  inline int f();
  void test() { (void)sizeof(f()); }
}

namespace test3 {
  void f();  // expected-warning{{inline function 'test3::f' is not defined}}
  inline void f();
  void test() { f(); }  // expected-note{{used here}}
}

namespace test4 {
  inline void error_on_zero(int);    // expected-warning{{inline function 'test4::error_on_zero' is not defined}}
  inline void error_on_zero(char*) {}
  void test() { error_on_zero(0); }  // expected-note{{used here}}
}

namespace test5 {
  struct X { void f(); };
  void test(X &x) { x.f(); }
}

namespace test6 {
  struct X { inline void f(); };  // expected-warning{{inline function 'test6::X::f' is not defined}}
  void test(X &x) { x.f(); }  // expected-note{{used here}}
}

namespace test7 {
  void f();  // expected-warning{{inline function 'test7::f' is not defined}}
  void test() { f(); } // no used-here note.
  inline void f();
}

namespace test8 {
  inline void foo() __attribute__((gnu_inline));
  void test() { foo(); }
}

namespace test9 {
  void foo();
  void test() { foo(); }
  inline void foo() __attribute__((gnu_inline));
}

namespace test10 {
  inline void foo();
  void test() { foo(); }
  inline void foo() __attribute__((gnu_inline));
}

namespace test11 {
  inline void foo() __attribute__((dllexport));
  inline void bar() __attribute__((dllimport));
  void test() { foo(); bar(); }
}
