#define __kernel __attribute__((address_space(0))) #define __user __attribute__((address_space(__user))) #define __iomem __attribute__((address_space(__iomem))) #define __percpu __attribute__((address_space(__percpu))) #define __rcu __attribute__((address_space(__rcu))) typedef struct s obj_t; static void expl(obj_t __kernel *k, obj_t __iomem *o, obj_t __user *p, obj_t __percpu *pc, obj_t __rcu *r) { (__UINTPTR_TYPE__)(k); // OK (unsigned long)(k); // OK (void *)(k); // OK (obj_t*)(k); // OK (obj_t __kernel*)(k); // OK (__UINTPTR_TYPE__)(o); // OK (unsigned long)(o); // OK (void *)(o); (obj_t*)(o); (obj_t __iomem*)(o); // OK (__UINTPTR_TYPE__)(p); // OK (unsigned long)(p); // OK (void *)(p); (obj_t*)(p); (obj_t __user*)(p); // OK (__UINTPTR_TYPE__)(pc); // OK (unsigned long)(pc); // OK (void *)(pc); (obj_t*)(pc); (obj_t __percpu*)(pc); // OK (__UINTPTR_TYPE__)(r); // OK (unsigned long)(r); // OK (void *)(r); (obj_t*)(r); (obj_t __rcu*)(r); // OK } /* * check-name: Waddress-space-from * check-command: sparse -Wno-cast-from-as $file * check-description: Test the removal of AS from a pointer but only * in the non-strict variant where casts to ulong (or uintptr_t) * are allowed. * * check-error-start Waddress-space-from.c:23:10: warning: cast removes address space '__iomem' of expression Waddress-space-from.c:24:10: warning: cast removes address space '__iomem' of expression Waddress-space-from.c:29:10: warning: cast removes address space '__user' of expression Waddress-space-from.c:30:10: warning: cast removes address space '__user' of expression Waddress-space-from.c:35:10: warning: cast removes address space '__percpu' of expression Waddress-space-from.c:36:10: warning: cast removes address space '__percpu' of expression Waddress-space-from.c:41:10: warning: cast removes address space '__rcu' of expression Waddress-space-from.c:42:10: warning: cast removes address space '__rcu' of expression * check-error-end */