Mercurial > hg > xemacs-beta
diff lwlib/xt-wrappers.h @ 4528:726060ee587c g++-warning-removal-2008-10-28
First draft of g++ 4.3 warning removal patch. Builds. *Needs ChangeLogs.*
author | Stephen J. Turnbull <stephen@xemacs.org> |
---|---|
date | Wed, 29 Oct 2008 04:06:33 +0900 |
parents | |
children | 2ade80e8c640 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lwlib/xt-wrappers.h Wed Oct 29 04:06:33 2008 +0900 @@ -0,0 +1,103 @@ +/* Wrappers for Xt functions and macros + + Copyright (C) 2008 Free Software Foundation + +This file is part of XEmacs. + +XEmacs is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +XEmacs is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. +You should have received a copy of the GNU General Public License +along with XEmacs; see the file COPYING. If not, write to +the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* Synched up with: Not in FSF. */ + +/* Original author: Stephen J. Turnbull for 21.5.29 */ + +/* Generic utility macros, including coping with G++ whining. + Used in lwlib via lwlib.h and X consoles via console-x.h. + + We would prefer to find another way to shut up G++. The issue is that + recent versions of the C++ standard deprecate implicit conversions + across function boundaries like + + typedef char *String; + void foo (String string); + foo ("bar"); + + because "bar" should be allowed to be a read-only array of chars. But of + course lots of legacy code (== X11) declares things as char * and expects + to assign literal strings to them. Now, the typedef in the example is + important because in G++ 4.3.2 at least, this + + void foo (const String string); + foo ("bar"); + + does not work as expected! G++ still warns about this construct. However, + if foo is declared + + void foo (const char *string); + + G++ does not complain. (#### There are two possibilities I can think of. + (a) G++ is buggy. (b) "const String" is interpreted as "char * const".) + + The upshot is that to avoid warnings with Xt's String typedef, we need to + arrange to cast literal strings to String, rather than use "const String" + in declarations. (My <X11/Intrinsic.h> says that the actual internal + typedef used is _XtString, so that String can be #define'd to something + else for the purposes of C++. But that doesn't really help us much.) + + It's not very satisfactory to do it this way -- it would be much better to + have const Strings where they make sense -- but it does eliminate a few + hundred warnings from the C++ build. And in any case we don't control the + many objects declared with String components in Intrinsic.h. The remaining + issues are the WEXTTEXT macro used in src/emacs.c, and Emacs.ad.h (where + instead of String we use const char * in src/event-Xt.c in the array that + #includes it). +*/ + +#ifndef INCLUDED_xt_wrappers_h_ +#define INCLUDED_xt_wrappers_h_ + +/* Wrap XtResource, with the same elements as arguments. + The cast to String shuts up G++ 4.3's whining about const char *. + The invocation of sizeof should be pretty safe, and the cast to XtPointer + surely is, since that's how that member of XtResource is declared. It + doesn't hide potential problems, because XtPointer is a "generic" type in + any case -- the actual object will have a different type, that will be + cast to XtPointer. */ + +#define Xt_RESOURCE(name,_class,intrepr,type,member,extrepr,value) \ + { (String) name, (String) _class, (String) intrepr, sizeof(type), \ + member, extrepr, (XtPointer) value } + +/* Wrap XtSetArg, with the same arguments. + The cast to String shuts up G++ 4.3's whining about const char *. */ + +#define Xt_SET_ARG(al, resource, x) do { \ + XtSetArg ((al), (String) (resource), (x)); \ + } while (0) + +/* Convenience macros for getting/setting one resource value. */ + +#define Xt_SET_VALUE(widget, resource, value) do { \ + Arg al; \ + Xt_SET_ARG (al, resource, value); \ + XtSetValues (widget, &al, 1); \ +} while (0) + +#define Xt_GET_VALUE(widget, resource, location) do { \ + Arg al; \ + Xt_SET_ARG (al, resource, location); \ + XtGetValues (widget, &al, 1); \ +} while (0) + +#endif /* INCLUDED_xt_wrappers_h_ */