1 // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fsyntax-only -verify %s
2 // RUN: %clang_cc1 -triple i386-unknown-linux-gnu -fsyntax-only -verify %s
3 // RUN: %clang_cc1 -triple x86_64-pc-win32 -fsyntax-only -verify %s
4 // RUN: %clang_cc1 -triple i386-pc-win32 -fsyntax-only -verify %s
5 // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnux32 -fsyntax-only -verify %s
9 static void foo(int *a
) __attribute__((interrupt
)) {}
10 void *operator new(__SIZE_TYPE__
) throw() __attribute__((interrupt
)) { return 0; } // expected-warning {{'interrupt' attribute only applies to non-K&R-style functions}}
13 struct a test
__attribute__((interrupt
)); // expected-warning {{'interrupt' attribute only applies to non-K&R-style functions}}
15 __attribute__((interrupt
)) int foo1(void) { return 0; } // expected-error-re {{{{(x86|x86-64)}} 'interrupt' attribute only applies to functions that have a 'void' return type}}
16 __attribute__((interrupt
)) void foo2(void) {} // expected-error-re {{{{(x86|x86-64)}} 'interrupt' attribute only applies to functions that have only a pointer parameter optionally followed by an integer parameter}}
17 __attribute__((interrupt
)) void foo3(void *a
, unsigned b
, int c
) {} // expected-error-re {{{{(x86|x86-64)}} 'interrupt' attribute only applies to functions that have only a pointer parameter optionally followed by an integer parameter}}
18 __attribute__((interrupt
)) void foo4(int a
) {} // expected-error-re {{{{(x86|x86-64)}} 'interrupt' attribute only applies to functions that have a pointer as the first parameter}}
20 // expected-error-re@+6 {{{{(x86|x86-64)}} 'interrupt' attribute only applies to functions that have a 'unsigned long' type as the second parameter}}
21 #elif defined(__x86_64__)
22 // expected-error-re@+4 {{{{(x86|x86-64)}} 'interrupt' attribute only applies to functions that have a 'unsigned long long' type as the second parameter}}
24 // expected-error-re@+2 {{{{(x86|x86-64)}} 'interrupt' attribute only applies to functions that have a 'unsigned int' type as the second parameter}}
26 __attribute__((interrupt
)) void foo5(void *a
, float b
) {}
28 // expected-error-re@+6 {{{{(x86|x86-64)}} 'interrupt' attribute only applies to functions that have a 'unsigned long' type as the second parameter}}
29 #elif defined(__x86_64__)
30 // expected-error-re@+4 {{{{(x86|x86-64)}} 'interrupt' attribute only applies to functions that have a 'unsigned long long' type as the second parameter}}
32 // expected-error-re@+2 {{{{(x86|x86-64)}} 'interrupt' attribute only applies to functions that have a 'unsigned int' type as the second parameter}}
34 __attribute__((interrupt
)) void foo6(float *a
, int b
) {}
37 // expected-error-re@+4 {{{{(x86|x86-64)}} 'interrupt' attribute only applies to functions that have a 'unsigned long' type as the second parameter}}
38 #elif defined(__x86_64__)
39 // expected-error-re@+2 {{{{(x86|x86-64)}} 'interrupt' attribute only applies to functions that have a 'unsigned long long' type as the second parameter}}
41 __attribute__((interrupt
)) void foo7(int *a
, unsigned b
) {}
42 __attribute__((interrupt
)) void foo8(int *a
) {}
44 __attribute__((interrupt
)) void foo9(T
*a
) {}
48 foo9(a
); // expected-error {{interrupt service routine cannot be called directly}}
51 template <typename Fn
>
55 __attribute__((interrupt
)) void foo(int *) {}
57 void g(void (*fp
)(int *));
58 int main(int argc
, char **argv
) {
59 void *ptr
= (void *)&foo7
;
62 a::foo(ptr
); // expected-error {{interrupt service routine cannot be called directly}}
65 // expected-error@+2 {{interrupt service routine cannot be called directly}}
67 foo7((int *)argv
, argc
);
68 foo8((int *)argv
); // expected-error {{interrupt service routine cannot be called directly}}
69 bar(argv
); // expected-note {{in instantiation of function template specialization 'bar<char *>' requested here}}