diff test/suite_aggrs/main.c @ 461:236015fdf7a8

suite_aggrs: - added support to gen unions in addition to structs - regenerated struct/union-mixed and nested cases - made rand-sig.lua ignore closing struct/union chars if not opened, effectively reducing number of empty aggregates as it now generated way too much
author Tassilo Philipp
date Mon, 31 Jan 2022 14:41:11 +0100
parents 0ae555528709
children 653b65580cb4
line wrap: on
line diff
--- a/test/suite_aggrs/main.c	Sun Jan 30 17:12:47 2022 +0100
+++ b/test/suite_aggrs/main.c	Mon Jan 31 14:41:11 2022 +0100
@@ -61,7 +61,7 @@
 
   dcReset(p);
 
-  if(*sig == '{') {
+  if(*sig == '{' || *sig == '<') {
     int len;
     int i = find_agg_idx(&len, sig);
     if(i == -1) {
@@ -92,8 +92,10 @@
       case 'p': dcArgPointer (p,K_p[pos]); break;
       case 'f': dcArgFloat   (p,K_f[pos]); break;
       case 'd': dcArgDouble  (p,K_d[pos]); break;
-      case '{': {
-        /* find struct sig */
+      case '<': /* union */
+      case '{': /* struct */
+	  {
+        /* find aggregate sig */
         int len;
         DCstruct *st;
         int i = find_agg_idx(&len, sig);
@@ -122,8 +124,10 @@
     case 'p': s = (dcCallPointer (p,t) == K_p[pos]) ; break;
     case 'f': s = (dcCallFloat   (p,t) == K_f[pos]) ; break;
     case 'd': s = (dcCallDouble  (p,t) == K_d[pos]) ; break;
-    case '{': {
-      /* bound check memory adjacent to returned struct, to check for overflows by dcCallStruct */
+    case '<': /* union */
+    case '{': /* struct */
+	{
+      /* bound check memory adjacent to returned aggregate, to check for overflows by dcCallStruct */
       long long* adj_ll = (get_max_aggr_size() - rtype_size) > sizeof(long long) ? (long long*)((char*)V_a[0] + rtype_size) : NULL;
       if(adj_ll)
         *adj_ll = 0x0123456789abcdef;
@@ -154,12 +158,14 @@
       case 'p': s = ( V_p[pos] == K_p[pos] ); if (!s) printf("'p':%d: %p != %p ; ",     pos, V_p[pos], K_p[pos]); break;
       case 'f': s = ( V_f[pos] == K_f[pos] ); if (!s) printf("'f':%d: %f != %f ; ",     pos, V_f[pos], K_f[pos]); break;
       case 'd': s = ( V_d[pos] == K_d[pos] ); if (!s) printf("'d':%d: %f != %f ; ",     pos, V_d[pos], K_d[pos]); break;
-      case '{': {
+      case '<': /* union */
+      case '{': /* struct */
+	  {
         /* no check: guaranteed to exist, or invoke func would've exited when passing args, above */
         int len;
         int i = find_agg_idx(&len, sig);
         s = ((int(*)(const void*,const void*))G_agg_cmpfuncs[i])(V_a[pos], K_a[pos]);
-        if (!s) printf("'{':%d:  *%p != *%p ; ", pos, V_a[pos], K_a[pos]);
+        if (!s) printf("'%c':%d:  *%p != *%p ; ", atype, pos, V_a[pos], K_a[pos]);
         sig += len-1; /* advance to next arg char */
         break;
       }
@@ -217,7 +223,7 @@
   dcFree(G_callvm);
   deinit_test_data(G_maxargs);
 
-  printf("result: suite_aggrs: %d\n", total);
+  printf("result: suite_aggrs: %d %d\n", total, get_max_aggr_size());
 
   dcTest_deInitPlatform();