* src/SDCC.y: fixed bug #716242, exchanged pointer and function declarator in the...
authorbernhardheld <bernhardheld@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Fri, 27 Jan 2006 21:38:09 +0000 (21:38 +0000)
committerbernhardheld <bernhardheld@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Fri, 27 Jan 2006 21:38:09 +0000 (21:38 +0000)
* 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

ChangeLog
src/SDCC.y
src/SDCCast.c
src/SDCCsymt.c
src/SDCCsymt.h
support/regression/tests/bug-716242.c [new file with mode: 0644]

index 61b509a734b9a87e8cdadaaa29a130df9606fcbb..48183fe74dc9f91b5d06e59cad4e27c53d8c21a6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+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
index a81e243e31054658c253d4ad8be28566e152e8a5..a5a0f32994af2952e10d8afc223b5baf109d6383 100644 (file)
@@ -1373,12 +1373,17 @@ abstract_declarator2
           
        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);
index dcddefdbf81827cf0c7d4d7c65d46720d8f01753..86fad20a2c504b803c58a6f1326c60858f92d4ca 100644 (file)
@@ -4348,7 +4348,10 @@ decorateType (ast * tree, RESULT_TYPE resultType)
           parmNumber = 1;
 
           if (IS_FUNCPTR (LTYPE (tree)))
-            functype = LTYPE (tree)->next;
+            {
+              functype = LTYPE (tree)->next;
+              processFuncPtrArgs (functype);
+            }
           else
             functype = LTYPE (tree);
 
index 5cb19d06a213d70c525258c6a943beac6e07f439..0c0c00cc0f9d6c2c1642378cfbc798df56e63814 100644 (file)
@@ -2568,6 +2568,22 @@ void cdbStructBlock (int block)
     }
 }
 
+/*-----------------------------------------------------------------*/
+/* 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       */
 /*-----------------------------------------------------------------*/
index 3699759ae1498bdc676d7c7336fcd842eff67402..dedf6e857b9394ee384ff471fc17fdafd8a6a178 100644 (file)
@@ -591,6 +591,7 @@ void addSymChain (symbol **);
 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);
diff --git a/support/regression/tests/bug-716242.c b/support/regression/tests/bug-716242.c
new file mode 100644 (file)
index 0000000..95f3268
--- /dev/null
@@ -0,0 +1,82 @@
+/* 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);
+}