* src/SDCCsymt.h,
* src/SDCCsymt.c (processFuncPtrArgs): added, removes "(void)" parameter list for function pointers
* src/SDCCast.c (decorateType): added call of processFuncPtrArgs()
* support/regression/tests/bug-716242.c: added
git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@4024
4a8a32a2-be11-0410-ad9d-
d568d2c75423
+2006-01-27 Bernhard Held <bernhard AT bernhardheld.de>
+
+ * src/SDCC.y: fixed bug #716242, exchanged pointer and function
+ declarator in the symbol chain
+ * src/SDCCsymt.h,
+ * src/SDCCsymt.c (processFuncPtrArgs): added, removes "(void)"
+ parameter list for function pointers
+ * src/SDCCast.c (decorateType): added call of processFuncPtrArgs()
+ * support/regression/tests/bug-716242.c: added
+
2006-01-20 Bernhard Held <bernhard AT bernhardheld.de>
* src/SDCCicode.c (geniCodeAdd, geniCodeArray): use char for array
FUNC_HASVARARGS(p) = IS_VARG($4);
FUNC_ARGS(p) = reverseVal($4);
-
+
/* nest level was incremented to take care of the parms */
NestLevel-- ;
currBlockno--;
- p->next = $1;
- $$ = p;
+ if (!$1) {
+ /* ((void (code *) (void)) 0) () */
+ $1=newLink(DECLARATOR);
+ DCL_TYPE($1)=CPOINTER;
+ $$ = $1;
+ }
+ $1->next=p;
// remove the symbol args (if any)
cleanUpLevel(SymbolTab,NestLevel+1);
parmNumber = 1;
if (IS_FUNCPTR (LTYPE (tree)))
- functype = LTYPE (tree)->next;
+ {
+ functype = LTYPE (tree)->next;
+ processFuncPtrArgs (functype);
+ }
else
functype = LTYPE (tree);
}
}
+/*-----------------------------------------------------------------*/
+/* processFuncPtrArgs - does some processing with args of func ptrs*/
+/*-----------------------------------------------------------------*/
+void
+processFuncPtrArgs (sym_link * funcType)
+{
+ value *val = FUNC_ARGS(funcType);
+
+ /* if it is void then remove parameters */
+ if (val && IS_VOID (val->type))
+ {
+ FUNC_ARGS(funcType) = NULL;
+ return;
+ }
+}
+
/*-----------------------------------------------------------------*/
/* processFuncArgs - does some processing with function args */
/*-----------------------------------------------------------------*/
sym_link *structElemType (sym_link *, value *);
symbol *getStructElement (structdef *, symbol *);
sym_link *computeType (sym_link *, sym_link *, RESULT_TYPE, int);
+void processFuncPtrArgs (sym_link *);
void processFuncArgs (symbol *);
int isSymbolEqual (symbol *, symbol *);
int powof2 (TYPE_UDWORD);
--- /dev/null
+/* bug-716242.c
+
+ syntax tests about function pointers at compile time
+ */
+#include <testfwk.h>
+
+#if defined(PORT_HOST) || defined(SDCC_z80) || defined(SDCC_gbz80) || defined(SDCC_hc08)
+# define code
+#endif
+
+void *p;
+int ret;
+
+int mul2 (int i)
+{
+ return 2 * i;
+}
+
+void g (int (*h) (int))
+{
+ ret = h (2);
+}
+
+void f1()
+{
+ p = (void *) mul2;
+ g ((int (*) (int)) p);
+}
+
+/****************************/
+
+void g (int (*h) (int));
+
+void f2()
+{
+ int (*fp) (int) = p;
+
+ g (fp);
+}
+
+/****************************/
+
+void g (int (*h) (int));
+
+void f3()
+{
+ int (*fp) (int) = (int (*) (int)) p;
+
+ g (fp);
+}
+
+/****************************/
+
+void f4()
+{
+ ((void (code *) (void)) p) ();
+}
+
+/****************************/
+
+void f5()
+{
+ int (*fp) (int) = mul2;
+
+ fp(1);
+}
+
+/****************************/
+
+void f6()
+{
+ ((void (code *) (void)) 0) ();
+}
+
+/****************************/
+
+static void
+testFuncPtr(void)
+{
+ f1();
+ ASSERT(ret == 4);
+}