1 // RUN: %clang_cc1 -x c -triple bpf-pc-linux-gnu -dwarf-version=4 -fsyntax-only -verify %s
2
3 struct s { int a; int b[4]; int c:1; };
4 union u { int a; int b[4]; int c:1; };
5
invalid1(const int * arg)6 unsigned invalid1(const int *arg) {
7 return __builtin_preserve_field_info(arg, 1); // expected-error {{__builtin_preserve_field_info argument 1 not a field access}}
8 }
9
invalid2(const int * arg)10 unsigned invalid2(const int *arg) {
11 return __builtin_preserve_field_info(*arg, 1); // expected-error {{__builtin_preserve_field_info argument 1 not a field access}}
12 }
13
invalid3(struct s * arg)14 void *invalid3(struct s *arg) {
15 return __builtin_preserve_field_info(arg->a, 1); // expected-warning {{incompatible integer to pointer conversion returning 'unsigned int' from a function with result type 'void *'}}
16 }
17
valid4(struct s * arg)18 unsigned valid4(struct s *arg) {
19 return __builtin_preserve_field_info(arg->b[1], 1);
20 }
21
valid5(union u * arg)22 unsigned valid5(union u *arg) {
23 return __builtin_preserve_field_info(arg->b[2], 1);
24 }
25
valid6(struct s * arg)26 unsigned valid6(struct s *arg) {
27 return __builtin_preserve_field_info(arg->a, 1);
28 }
29
valid7(struct s * arg)30 unsigned valid7(struct s *arg) {
31 return __builtin_preserve_field_info(arg->c, 1ULL);
32 }
33
valid8(union u * arg)34 unsigned valid8(union u *arg) {
35 return __builtin_preserve_field_info(arg->a, 1);
36 }
37
valid9(union u * arg)38 unsigned valid9(union u *arg) {
39 return __builtin_preserve_field_info(arg->c, 'a');
40 }
41
invalid10(struct s * arg)42 unsigned invalid10(struct s *arg) {
43 return __builtin_preserve_field_info(arg->a, arg); // expected-error {{__builtin_preserve_field_info argument 2 not a constant}}
44 }
45
invalid11(struct s * arg,int info_kind)46 unsigned invalid11(struct s *arg, int info_kind) {
47 return __builtin_preserve_field_info(arg->a, info_kind); // expected-error {{__builtin_preserve_field_info argument 2 not a constant}}
48 }
49