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