On Sun, Oct 17, 2010 at 12:31:26PM +0200, Tomas Klacko wrote: > On Sat, Oct 16, 2010 at 9:11 PM, Josh Triplett <josh@xxxxxxxxxxxxxxxx> wrote: > > On Sat, Oct 16, 2010 at 06:03:53PM +0200, Tomas Klacko wrote: > >> On Wed, Oct 13, 2010 at 2:37 AM, Christopher Li <sparse@xxxxxxxxxxx> wrote: > >> > On Tue, Oct 12, 2010 at 3:45 PM, Tomas Klacko <tomas.klacko@xxxxxxxxx> wrote: > > >> >> Â/* Silly type-safety check ;) */ > >> >> Â#define DECLARE_PTR_LIST(listname,type)    Âstruct listname { type *list[1]; } > >> >> -#define CHECK_TYPE(head,ptr)      (void)(&(ptr) == &(head)->list[0]) > >> >> Â#define TYPEOF(head)          __typeof__(&(head)->list[0]) > >> >> Â#define VRFY_PTR_LIST(head)      Â(void)(sizeof((head)->list[0])) > >> >> > >> >> +#ifndef __cplusplus > >> >> +#define CHECK_TYPE(head,ptr)      (void)(&(ptr) == &(head)->list[0]) > >> >> +#else > >> >> +/* I don't know yet how to do this better in C++. */ > >> >> +#define CHECK_TYPE(head,ptr) (void)((void*)&(ptr) == (void*)&(head)->list[0]) > >> >> +#endif > >> > > >> > If you can't get CHECK_TYPE work in C++, you might just make it an empty define > >> > instead of doing useless point dancing. At least it is clear that it does not > >> > do any thing here. > >> > >> True. How about > >> #define CHECK_TYPE (head,ptr)  (void)(1) > >> ? > > > > As far as I can tell, CHECK_TYPE works just fine in C++. ÂI could easily > > compile an invocation of CHECK_TYPE, as well as some simple examples > > that called the macros which invoked CHECK_TYPE. ÂWhen I tried > > FOR_EACH_PTR, I encountered *other* warnings (related to assigning (void > > *) to some other type without a cast), but those warnings didn't come > > from CHECK_TYPE. > > Maybe I did not investigate deeply enough to find out the origin of > the warnings. > But I get no warnings/errors, when I disable CHECK_TYPE in C++ code. > > > What warning do you encounter about CHECK_TYPE? > > In the following code1 (file main.cc): > int main(int argc, char* argv[]) > { > struct string_list *files=NULL; > > void* file_void; > char* file_char; > > struct symbol_list *symbols=NULL; > struct symbol_list *all_symbols=NULL; > > symbols=sparse_initialize(argc, argv, &files); > concat_symbol_list(symbols, &all_symbols); > > FOR_EACH_PTR_NOTAG(files, file_void) { // line 19 > file_char=(char*)file_void; > symbols=sparse(file_char); > concat_symbol_list(symbols, &all_symbols); > } END_FOR_EACH_PTR_NOTAG(file_void); > > exit(EXIT_SUCCESS); > } > > I get: > main.cc: In function âint main(int, char**)â: > main.cc:19: error: comparison between distinct pointer types âvoid*â > and âchar*â lacks a cast This warning means that CHECK_TYPE has done its job correctly; you should not use the void * file_void to iterate over a list of files. FOR_EACH_PTR (and the _NOTAG variant) expect a list type and the corresponding element type, and they use CHECK_TYPE to make this type-safe. > compiler and (important) flags: > g++ (GCC) 4.2.4 (Ubuntu 4.2.4-1ubuntu4), -Wall -Werror > > > Now, the code2 (file main.cc): > int main(int argc, char* argv[]) > { > struct string_list *files=NULL; > > char* file_char; > > struct symbol_list *symbols=NULL; > struct symbol_list *all_symbols=NULL; > > symbols=sparse_initialize(argc, argv, &files); > concat_symbol_list(symbols, &all_symbols); > > FOR_EACH_PTR_NOTAG(files, file_char) { // line 18 > symbols=sparse(file_char); > concat_symbol_list(symbols, &all_symbols); > } END_FOR_EACH_PTR_NOTAG(file_char); > > exit(EXIT_SUCCESS); > } > > I get error: > main.cc: In function âint main(int, char**)â: > main.cc:18: error: invalid conversion from âvoid*â to âchar*â This warning doesn't come from CHECK_TYPE; it comes from the subsequent implicit conversion from the list's void * to the desired type char *, which will indeed need a cast to work correctly when included from C++. Based on these two code examples, I think you don't need to change CHECK_TYPE at all. (And the user should always use code like your second example, not your first example.) (Of course, if someone really wants to use these lists from C++, they might want to build appropriate type-safe C++ iterator types on top of the ptrlist bits. :) ) - Josh Triplett -- To unsubscribe from this list: send the line "unsubscribe linux-sparse" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html