In linux 5.4.21 source code include/linux/irqflags.h,
#define raw_local_save_flags(flags) \
do { \
typecheck(unsigned long, flags); \
flags = arch_local_save_flags(); \
} while (0)
and in include/linux/typecheck.h
#define typecheck(type,x) \
({ type __dummy; \
typeof(x) __dummy2; \
(void)(&__dummy == &__dummy2); \
1; \
})
I can't understand how the typecheck macro works. So the typecheck macro makes a variable __dummy having type type
, and another variable __dummy2 with the same type with x
. It then compares the address of those two variables. I guess putting (void)
makes the comparison statement not make error.. but what does this comparison do? How can two variables have same address? and what is the last state 1;
? And what effect does this macro have in the raw_local_save_flags
macro? (related to how it is called..) Can somebody explain it to me please? Thanks!