| // REQUIRES: x86-registered-target |
| // RUN: %clang_cc1 -triple x86_64-linux-gnu -verify=expected,enabled -emit-codegen-only %s |
| // RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -emit-codegen-only -Wno-attribute-warning %s |
| |
| __attribute__((error("oh no foo"))) void foo(void); |
| |
| __attribute__((error("oh no bar"))) void bar(void); |
| |
| int x(void) { |
| return 8 % 2 == 1; |
| } |
| |
| __attribute__((warning("oh no quux"))) void quux(void); |
| |
| __attribute__((error("demangle me"))) void __compiletime_assert_455(void); |
| |
| __attribute__((error("one"), error("two"))) // expected-warning {{attribute 'error' is already applied with different arguments}} |
| void // expected-note@-1 {{previous attribute is here}} |
| duplicate_errors(void); |
| |
| __attribute__((warning("one"), warning("two"))) // expected-warning {{attribute 'warning' is already applied with different arguments}} |
| void // expected-note@-1 {{previous attribute is here}} |
| duplicate_warnings(void); |
| |
| void baz(void) { |
| foo(); // expected-error {{call to foo() declared with 'error' attribute: oh no foo}} |
| if (x()) |
| bar(); // expected-error {{call to bar() declared with 'error' attribute: oh no bar}} |
| |
| quux(); // enabled-warning {{call to quux() declared with 'warning' attribute: oh no quux}} |
| __compiletime_assert_455(); // expected-error {{call to __compiletime_assert_455() declared with 'error' attribute: demangle me}} |
| duplicate_errors(); // expected-error {{call to duplicate_errors() declared with 'error' attribute: two}} |
| duplicate_warnings(); // enabled-warning {{call to duplicate_warnings() declared with 'warning' attribute: two}} |
| } |
| |
| #ifdef __cplusplus |
| template <typename T> |
| __attribute__((error("demangle me, too"))) |
| T |
| nocall(T t); |
| |
| struct Widget { |
| __attribute__((warning("don't call me!"))) |
| operator int() { return 42; } |
| }; |
| |
| void baz_cpp(void) { |
| foo(); // expected-error {{call to foo() declared with 'error' attribute: oh no foo}} |
| if (x()) |
| bar(); // expected-error {{call to bar() declared with 'error' attribute: oh no bar}} |
| quux(); // enabled-warning {{call to quux() declared with 'warning' attribute: oh no quux}} |
| |
| // Test that we demangle correctly in the diagnostic for C++. |
| __compiletime_assert_455(); // expected-error {{call to __compiletime_assert_455() declared with 'error' attribute: demangle me}} |
| nocall<int>(42); // expected-error {{call to int nocall<int>(int) declared with 'error' attribute: demangle me, too}} |
| |
| Widget W; |
| int w = W; // enabled-warning {{Widget::operator int() declared with 'warning' attribute: don't call me!}} |
| } |
| #endif |