attr-noreturn.cpp revision a5728872c7702ddd09537c95bc3cbd20e1f2fb09
1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s
243c79c2b07abc7ba6d9f243b84ee6539de4d2652Douglas Gregor
343c79c2b07abc7ba6d9f243b84ee6539de4d2652Douglas Gregor// PR5620
443c79c2b07abc7ba6d9f243b84ee6539de4d2652Douglas Gregorvoid f0() __attribute__((__noreturn__));
543c79c2b07abc7ba6d9f243b84ee6539de4d2652Douglas Gregorvoid f1(void (*)());
643c79c2b07abc7ba6d9f243b84ee6539de4d2652Douglas Gregorvoid f2() { f1(f0); }
743c79c2b07abc7ba6d9f243b84ee6539de4d2652Douglas Gregor
843c79c2b07abc7ba6d9f243b84ee6539de4d2652Douglas Gregor// Taking the address of a noreturn function
943c79c2b07abc7ba6d9f243b84ee6539de4d2652Douglas Gregorvoid test_f0a() {
1043c79c2b07abc7ba6d9f243b84ee6539de4d2652Douglas Gregor  void (*fp)() = f0;
1143c79c2b07abc7ba6d9f243b84ee6539de4d2652Douglas Gregor  void (*fp1)() __attribute__((noreturn)) = f0;
1243c79c2b07abc7ba6d9f243b84ee6539de4d2652Douglas Gregor}
1343c79c2b07abc7ba6d9f243b84ee6539de4d2652Douglas Gregor
1443c79c2b07abc7ba6d9f243b84ee6539de4d2652Douglas Gregor// Taking the address of an overloaded noreturn function
1543c79c2b07abc7ba6d9f243b84ee6539de4d2652Douglas Gregorvoid f0(int) __attribute__((__noreturn__));
1643c79c2b07abc7ba6d9f243b84ee6539de4d2652Douglas Gregor
1743c79c2b07abc7ba6d9f243b84ee6539de4d2652Douglas Gregorvoid test_f0b() {
1843c79c2b07abc7ba6d9f243b84ee6539de4d2652Douglas Gregor  void (*fp)() = f0;
1943c79c2b07abc7ba6d9f243b84ee6539de4d2652Douglas Gregor  void (*fp1)() __attribute__((noreturn)) = f0;
2043c79c2b07abc7ba6d9f243b84ee6539de4d2652Douglas Gregor}
2143c79c2b07abc7ba6d9f243b84ee6539de4d2652Douglas Gregor
2243c79c2b07abc7ba6d9f243b84ee6539de4d2652Douglas Gregor// No-returned function pointers
2343c79c2b07abc7ba6d9f243b84ee6539de4d2652Douglas Gregortypedef void (* noreturn_fp)() __attribute__((noreturn));
2443c79c2b07abc7ba6d9f243b84ee6539de4d2652Douglas Gregor
2543c79c2b07abc7ba6d9f243b84ee6539de4d2652Douglas Gregorvoid f3(noreturn_fp); // expected-note{{candidate function}}
2643c79c2b07abc7ba6d9f243b84ee6539de4d2652Douglas Gregor
2743c79c2b07abc7ba6d9f243b84ee6539de4d2652Douglas Gregorvoid test_f3() {
2843c79c2b07abc7ba6d9f243b84ee6539de4d2652Douglas Gregor  f3(f0); // okay
2943c79c2b07abc7ba6d9f243b84ee6539de4d2652Douglas Gregor  f3(f2); // expected-error{{no matching function for call}}
3043c79c2b07abc7ba6d9f243b84ee6539de4d2652Douglas Gregor}
31