attr-noreturn.cpp revision f75b8309e3e40290683e3d34bac3a04e88d9c625
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} 31f75b8309e3e40290683e3d34bac3a04e88d9c625Nuno Lopes 32f75b8309e3e40290683e3d34bac3a04e88d9c625Nuno Lopes 33f75b8309e3e40290683e3d34bac3a04e88d9c625Nuno Lopesclass xpto { 34f75b8309e3e40290683e3d34bac3a04e88d9c625Nuno Lopes int blah() __attribute__((noreturn)); 35f75b8309e3e40290683e3d34bac3a04e88d9c625Nuno Lopes}; 36f75b8309e3e40290683e3d34bac3a04e88d9c625Nuno Lopes 37f75b8309e3e40290683e3d34bac3a04e88d9c625Nuno Lopesint xpto::blah() { 38f75b8309e3e40290683e3d34bac3a04e88d9c625Nuno Lopes return 3; // expected-warning {{function 'blah' declared 'noreturn' should not return}} 39f75b8309e3e40290683e3d34bac3a04e88d9c625Nuno Lopes} 40