source: tests/array-collections/array-raii.hfa@ 299bd989

Last change on this file since 299bd989 was 28c2c9d5, checked in by Michael Brooks <mlbrooks@…>, 9 months ago

Try to fix full build by suppressing known warning's -W code under gcc 7-8-9.

  • Property mode set to 100644
File size: 5.0 KB
Line 
1//
2// Cforall Version 1.0.0 Copyright (C) 2023 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
6//
7// array-raii.hfa -- combined test implementation for both -c and -cfa versions
8//
9// Author : Mike Brooks
10// Created On : Fri Sep 22 15:00:00 2023
11// Last Modified By :
12// Last Modified On :
13// Update Count :
14//
15
16
17#include <raii.hfa>
18
19// To keep C- vs CFA-array compatibility simple. these tests
20// - use only single-place subscripting, like `m[1][2]`, while deferring
21// equivalence of m[1][2] vs m[1,2] to array-md-sbscr-cases
22// - declare arrays via test-specific ADECL macros
23
24
25
26volatile bool checkme = false;
27char junkref[] = "junk";
28extern "C" {
29 char* strcpy(char* destination, const char* source);
30}
31
32// Array of built-in type does not get zeroed
33// (Surprised?)
34// Because it has nothing to do with arrays.
35// Built-in types have no-op ctors.
36// (Still surprised? Me too.)
37// If pigs flew and built-ins zeroed themselves, then
38// Array of built-in type gets zeroed
39// Array of user-defined type with autogen ctors gets wrapped builtins zeroed (intended purpose of case2 when originally written)
40// Expected outcome becomes "all zero" twice
41// As is
42// case1 pretty much just shows the summary statement above and
43// verifying the case2-wrapper behaviour is just silly, so
44// the quality of respecting autogens is checked (for real this time) under test_custom
45void test_builtins() {
46 void writeJunkOnStack(int depth) {
47 if (depth == 0) return;
48 char junk[5];
49 strcpy(junk, junkref);
50 writeJunkOnStack(depth-1);
51 if (checkme) printf("%s\n", junk);
52 }
53 void checkzero(float f0, float f1, float f2, float f3, float f4) {
54 if (f0 == 0.f && f1 == 0.f && f2 == 0.f && f3 == 0.f && f4 == 0.f) {
55 printf("all zero\n");
56 } else {
57 printf("some nonzero\n");
58 //printf("%f %f %f %f %f\n", f0, f1, f2, f3, f4);
59 }
60 }
61 #pragma GCC diagnostic push
62 #pragma GCC diagnostic ignored "-Wuninitialized"
63 #pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
64 void case1() {
65 ADECL1(x, float, 5)
66 checkzero(x[0], x[1], x[2], x[3], x[4]);
67 }
68 struct ffloat { float f; };
69 void case2() {
70 ADECL1(x, ffloat, 5)
71 checkzero(x[0].f, x[1].f, x[2].f, x[3].f, x[4].f);
72 }
73 #pragma GCC diagnostic pop
74
75 writeJunkOnStack(5);
76 case1();
77 printf("silly: ");
78 writeJunkOnStack(5);
79 case2();
80}
81
82// Array of type with custom raii sees cdtors called
83// Array of user-defined type with autogen cdtors gets wrapped cdtors called
84void test_custom() {
85 int nctorcalls;
86 struct thing { int mem; };
87 void ?{}( thing & this ) {
88 (this.mem){ nctorcalls++ };
89 printf("ctor %d\n", this.mem);
90 }
91 void ^?{}( thing & this ) {
92 printf("dtor %d\n", this.mem);
93 }
94 struct wrapper1 { thing inner; };
95 forall( T ) struct wrapper2 { T inner; };
96 printf(" [1]\n");
97 {
98 nctorcalls = 0;
99 ADECL1(a, thing, 5)
100 for(i; 5) printf("func %d\n", a[i].mem);
101 }
102 printf(" [2]\n");
103 {
104 // White-box note: For the CFA array, the array cdtor is satisfying
105 // its own assertion, in a two-level recursive setup.
106 nctorcalls = 0;
107 ADECL2(a, thing, 2, 3)
108 for(i; 2) for(j; 3) printf("func %d at (%d, %d)\n", a[i][j].mem, i, j);
109 }
110 printf(" [3]\n");
111 {
112 nctorcalls = 0;
113 ADECL1(a, wrapper1, 5)
114 for(i; 5) printf("func %d\n", a[i].inner.mem);
115 }
116 printf(" [4]\n");
117 {
118 nctorcalls = 0;
119 ADECL1(a, wrapper2(thing), 5)
120 for(i; 5) printf("func %d\n", a[i].inner.mem);
121 }
122}
123
124struct thing { int mem; };
125void ?{}( thing & this, int i ) {
126 (this.mem){ i };
127 printf("ctor %d\n", this.mem);
128}
129void ?{}( thing & this ) {
130 (this){ 999 };
131}
132void ^?{}( thing & this ) {
133 printf("dtor %d\n", this.mem);
134}
135
136// Array of uninits sees explicit ctor calls (only), and implied dtor calls
137void test_uninit() {
138 printf(" [1]\n");
139 {
140 ADECL1(a, uninit(thing), 5)
141 printf("before ctors\n");
142 for(i; 5) {
143 if (i == 1)
144 emplace(a[i]);
145 else if (i == 2)
146 emplace(a[i], 888);
147 else
148 (a[i]){i};
149 }
150 for(i; 5) printf("func %d\n", a[i].mem);
151 }
152 printf(" [2]\n");
153 {
154 ADECL2(a, uninit(thing), 2, 3)
155 printf("before ctors\n");
156 for(i; 2) for(j; 3) {
157 if (i == 1 && j == 1)
158 emplace(a[i][j]);
159 else if (i == 1 && j == 2)
160 emplace(a[i][j], 888);
161 else
162 (a[i][j]){100 + 10 * i + j};
163 }
164 for(i; 2) for(j; 3) {
165 printf("func %d at (%d, %d)\n", a[i][j].mem, i, j);
166 }
167 }
168}
169
170void test_extras();
171
172int main() {
173 printf("=== builtins\n");
174 test_builtins();
175
176 printf("=== custom\n");
177 test_custom();
178
179 printf("=== uninit ( uNoCtor[] )\n");
180 test_uninit();
181
182 test_extras();
183}
Note: See TracBrowser for help on using the repository browser.