[comp.lang.c] Problem with Geometry Handler definition syntax, X11R3

leach@tolerant.com (Geoffrey Leach) (12/28/89)

/*
**	These three typedefs are taken from the X11R3 Xt Intrinsics
**	header files.  
*/

typedef enum  { XtGeometryYes } XtGeometryResult;

typedef XtGeometryResult (*XtGeometryHandler)();

typedef struct _CompositeClassPart {
	XtGeometryHandler geometry_manager;
}		CompositeClassPart;

/*
**	Here's the problem code
*/

extern XtGeometryHandler foo();

CompositeClassPart ccp	= {
	foo
};

/*
**	And the result from the SVR3.2.2 cc is the warning:
**
**	"p.c", line 22: warning: illegal pointer combination, op =
**
**	The key to the complaint appears to be the fact that the
**	typedef is a pointer to a procedure returning an enum.
**	Is this a peculiarity of ATT's cc?  Anyone know of a workaround?
*/

walter@hpclwjm.HP.COM (Walter Murray) (12/29/89)

Geoffrey Leach writes:

[abridged to conserve bandwidth]

> typedef enum  { XtGeometryYes } XtGeometryResult;
> typedef XtGeometryResult (*XtGeometryHandler)();
> typedef struct _CompositeClassPart {
> 	XtGeometryHandler geometry_manager;
> }		CompositeClassPart;
> extern XtGeometryHandler foo();
> CompositeClassPart ccp	= { foo };
> /*
> **	And the result from the SVR3.2.2 cc is the warning:
> **	   warning: illegal pointer combination, op =
> **	The key to the complaint appears to be the fact that the
> **	typedef is a pointer to a procedure returning an enum.
> **	Is this a peculiarity of ATT's cc?  Anyone know of a workaround?
> */
----------
No, the compiler is correct.  The code is illegal.  Some compilers
won't complain; some will.  Any ANSI-conforming compiler should
complain.

My guess is that you didn't declare foo() the way you meant to.
Perhaps you meant:

   extern XtGeometryResult foo();

Warning:  I know nothing about the Xt intrinsics.  This is just a guess.

Walter Murray
---