| // RUN: %clang_cc1 -fsyntax-only -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)); |
| } |