diff options
Diffstat (limited to 'clang/test/Sema/bpf-attr-preserve-access-index.c')
-rw-r--r-- | clang/test/Sema/bpf-attr-preserve-access-index.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/clang/test/Sema/bpf-attr-preserve-access-index.c b/clang/test/Sema/bpf-attr-preserve-access-index.c new file mode 100644 index 00000000000..472f778b6b5 --- /dev/null +++ b/clang/test/Sema/bpf-attr-preserve-access-index.c @@ -0,0 +1,48 @@ +// RUN: %clang_cc1 -x c -triple bpf-pc-linux-gnu -dwarf-version=4 -fsyntax-only -verify %s + +#define __reloc__ __attribute__((preserve_access_index)) +#define __err_reloc__ __attribute__((preserve_access_index(0))) + +struct t1 { + int a; + int b[4]; + int c:1; +} __reloc__; + +union t2 { + int a; + int b[4]; + int c:1; +} __reloc__; + +struct t3 { + int a; +} __err_reloc__; // expected-error {{'preserve_access_index' attribute takes no arguments}} + +struct t4 { + union { + int a; + char b[5]; + }; + struct { + int c:1; + } __reloc__; + int d; +} __reloc__; + +struct __reloc__ p; +struct __reloc__ q; +struct p { + int a; +}; + +int a __reloc__; // expected-error {{preserve_addess_index attribute only applies to struct or union type}} +struct s *p __reloc__; // expected-error {{preserve_addess_index attribute only applies to struct or union type}} + +void invalid1(const int __reloc__ *arg) {} // expected-error {{preserve_addess_index attribute only applies to struct or union type}} +void invalid2() { const int __reloc__ *arg; } // expected-error {{preserve_addess_index attribute only applies to struct or union type}} +int valid3(struct t4 *arg) { return arg->a + arg->b[3] + arg->c + arg->d; } +int valid4(void *arg) { + struct local_t { int a; int b; } __reloc__; + return ((struct local_t *)arg)->b; +} |