On Fri, Oct 19, 2012 at 10:26:58AM +0200, Richard Biener wrote: > On Thu, Oct 18, 2012 at 10:33 PM, Basile Starynkevitch > <bas...@starynkevitch.net> wrote: > > Hello > > > > I'm coding in MELT the ex06/ of https://github.com/bstarynk/melt-examples/ > > which should typecheck calls to variadic functions json_pack & json_unpack > > from http://www.digip.org/jansson (a JSON library in C). > > > > I'm working on a MELT pass on Gimple/SSA after phiopt (maybe that place is > > wrong?) > > > > I don't understand well how to check that a given Gimple argument is a > > string. > > I was thinking of using useless_type_conversion_p or types_compatible_p on > > the TREE_TYPE of some POINTER_TYPE with char_type_node, but it seems to not > > work as I would expect > > > > How would you (in C++ or C for a 4.6) code such a test (that argument 2 of > > some GIMPLE_CALL is a string, ie. a char* in C parlance)? > > You would look at the function signature of the function called, not at its > argument. The argument can be a void * and still be a "string" (well, a > pointer > to a string). GIMPLE doesn't care about the actual type pointed to.
GCC is using the syntactic type of the argument for printf. The following code void f (char *s) { printf ("%s\n", (void *) s); } gives when compiled with gcc -Wall f.c:4:1: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘void *’ [-Wformat] and we are in the case where the argument is a string casted to (void*); I don't want to give more clever warnings. So I don't follow you. I want to typecheck (at least in the common simple cases) the calls to that variadic function. I don't care that much about its signature. To be concrete, <jansson.h> declares json_t *json_pack(const char *fmt, ...); and the documentation http://www.digip.org/jansson/doc/2.4/apiref.html#building-values suggests that /* Create the JSON integer 42 */ json_pack("i", 42); /* Create the JSON array ["foo", "bar", true] */ json_pack("[ssb]", "foo", "bar", 1); I just want to extend GCC (thru a MELT extension, but that could be a GCC plugin in C++) to detect incorrect calls like json_pack("i", /*that should be an int:*/ 3.14); or json_pack("[ss]", "foo", /* that should be a string*/ 3 /*and the arity is wrong an argument is missing*/); I believe I should use extern bool useless_type_conversion_p (tree, tree); from gcc/gimple.h (it is funny that function is in gimple.h, I would expected it to be in tree.h) with one of the argument being char_type_node But I might have trouble in using it. Thanks for reading. Regards. -- Basile STARYNKEVITCH http://starynkevitch.net/Basile/ email: basile<at>starynkevitch<dot>net mobile: +33 6 8501 2359 8, rue de la Faiencerie, 92340 Bourg La Reine, France *** opinions {are only mines, sont seulement les miennes} ***