Changeset 6da49249 for src/tests/forall.c
- Timestamp:
- Jul 16, 2018, 2:59:32 PM (7 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, no_list, persistent-indexer, pthread-emulation, qualifiedEnum
- Children:
- 8a3ecb9, 95d09bdb
- Parents:
- 0a73148
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/tests/forall.c
r0a73148 r6da49249 1 int ?=?( int*, int ); 2 float ?=?( float*, float ); 3 int * ?=?( int **, int * ); 4 float * ?=?( float **, float * ); 5 char ?=?( char*, char ); 6 void (* ?=?( void (**)(void), void (*)(void) ))(void); 1 // 2 // Cforall Version 1.0.0 Copyright (C) 2015 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 // forall.c -- 8 // 9 // Author : Peter A. Buhr 10 // Created On : Wed May 9 08:48:15 2018 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Jul 12 16:19:08 2018 13 // Update Count : 30 14 // 7 15 8 16 void g1() { 9 forall( otype T ) T f( T ) ;10 void f( int ) ;11 void h( void (*p)(void) ) ;17 forall( otype T ) T f( T ) {}; 18 void f( int ) {}; 19 void h( void (*p)(void) ) {}; 12 20 13 21 int x; … … 24 32 25 33 void g2() { 26 forall( otype T ) void f( T, T ) ;27 forall( otype T, otype U ) void f( T, U ) ;34 forall( otype T ) void f( T, T ) {} 35 forall( otype T, otype U ) void f( T, U ) {} 28 36 29 37 int x; … … 37 45 } 38 46 39 typedef forall ( otype T ) int (* f)( int );47 typedef forall ( otype T ) int (* f)( int ); 40 48 41 49 forall( otype T ) … … 46 54 } 47 55 56 void ?{}( int & c, zero_t ) { c = 0; } // not in prelude 57 48 58 trait sumable( otype T ) { 49 const T 0; 50 T ?+?(T, T); 51 T ?++(T); 52 [T] ?+=?(T,T); 53 }; 54 55 otype T1 | { const T1 0; T1 ?+?(T1, T1); T1 ?++(T1); [T1] ?+=?(T1,T1); }, 56 T2(otype P1, otype P2 ), 57 T3 | sumable(T3); 58 59 otype T2(otype P1, otype P2) | sumable(T2(P1,P2)) = struct { P1 i; P2 j; }; 60 61 T2(int, int) w1; 62 typedef T2(int, int) w2; 63 w2 g2; 64 otype w3 = T2(int, int); 65 w3 g3; 66 67 forall( otype T | sumable( T ) ) 68 T sum( int n, T a[] ) { 69 T total = 0; 70 int i; 71 for ( i = 0; i < n; i += 1 ) 72 total = total + a[i]; 59 void ?{}( T &, zero_t ); // 0 literal constructor 60 T ?+?( T, T ); // assortment of additions 61 T ?+=?( T &, T ); 62 T ++?( T & ); 63 T ?++( T & ); 64 }; // sumable 65 66 forall( otype T | sumable( T ) ) // use trait 67 T sum( size_t size, T a[] ) { 68 T total = 0; // initialize by 0 constructor 69 for ( size_t i = 0; i < size; i += 1 ) 70 total = total + a[i]; // select appropriate + 73 71 return total; 74 } 75 76 forall( otype T | { const T 0; T ?+?(T, T); T ?++(T); [T] ?+=?(T,T); } )72 } // sum 73 74 forall( otype T | { T ?+?( T, T ); T ?++( T & ); [T] ?+=?( T &,T ); } ) 77 75 T twice( T t ) { 78 76 return t + t; 79 77 } 80 78 81 forall( otype T | { const T 0; int ?!=?(T, T);int ?<?(T, T); } )79 forall( otype T | { int ?<?(T, T); } ) 82 80 T min( T t1, T t2 ) { 83 81 return t1 < t2 ? t1 : t2; 84 82 } 85 83 86 int main() {84 int fred() { 87 85 int x = 1, y = 2, a[10]; 88 86 float f; … … 94 92 } 95 93 94 // Multiple forall 95 forall( otype T ) forall( otype S ) struct { int i; }; 96 forall( otype T ) struct { int i; } forall( otype S ); 97 struct { int i; } forall( otype T ) forall( otype S ); 98 forall( otype W ) struct { int i; } forall( otype T ) forall( otype S ); 99 100 // Distribution 101 struct P { int i; }; 102 forall( otype T ) struct Q { T i; }; 103 forall( otype T ) struct { int i; }; 104 struct KK { int i; }; 105 inline static { 106 void RT1() {} 107 } 108 forall( otype T ) { 109 T RT2( T ) { 110 typedef int TD1; 111 struct S1 { T t; }; 112 } 113 forall( otype X ) { 114 typedef int TD2; 115 struct S2 {}; 116 X RT2( T, X ) { 117 int TD2; 118 } 119 } 120 extern "C" { 121 forall( otype W ) { 122 W RT3( W ) {} 123 struct S3 {}; 124 } 125 } 126 void RT4() { 127 forall( otype W ) struct S4 {}; 128 typedef int TD3; 129 } 130 static { 131 struct S5 {}; 132 void RT5( T ) { 133 struct S6 {}; 134 int TD2; 135 } 136 } 137 struct S7 {}; 138 typedef int TD4; 139 } 140 TD2 t2; 141 TD4 t4; 142 struct Q( int ) t; 143 struct S2( int, int ) t; 144 struct S5( int ) t; 145 struct S7( int ) t; 146 147 int i = RT2( 3 ); 148 double j = RT2( 3, 4.5 ); 149 150 static inline { 151 forall( otype T ) { 152 int RT6( T p ); 153 } 154 forall( otype T, otype U ) { 155 int RT7( T, U ); 156 } 157 } 158 static forall( otype T ) { 159 int RT8( T ); 160 } 161 forall( otype T ) inline static { 162 int RT9( T ) { T t; } 163 } 164 165 forall( otype T | { T ?+?( T, T ); } ) { 166 forall( otype S | { T ?+?( T, S ); } ) { 167 forall( otype W ) T bar( T t, S s ) { return t + s; } 168 forall( otype W | { W ?+?( T, W ); } ) W baz( T t, S s, W w ) { return t + s + w; } 169 struct W { T t; } (int,int) ww; 170 struct P pp; 171 } 172 } 173 174 forall( otype T | { T ?+?( T, T ); } ) forall( otype S | { T ?+?( T, S ); } ) 175 struct XW { T t; }; 176 XW(int,int) xww; 177 178 forall( otype T ) struct S { T t; } (int) x, y, z; 179 forall( otype T ) struct { T t; } (int) a, b, c; 180 181 forall( otype T ) static forall( otype S ) { 182 forall( otype X ) struct U { 183 T x; 184 }; 185 } 186 187 forall( otype T ) { 188 extern "C" { 189 struct SS { T t; }; 190 T foo( T ) {} 191 } 192 } 193 194 SS(int) s; 195 W(int,int) w; 196 197 int jane() { 198 // int j = bar( 3, 4 ); 199 int k = baz( 3, 4, 5 ); 200 int i = foo( 3 ); 201 } 202 203 //otype T1 | { void xxx( T1 ); }; 204 205 // otype T1 | { void ?{}( T1 &, zero_t ); T1 ?+?(T1, T1); T1 ?++(T1); [T1] ?+=?(T1,T1); }, 206 // T2(otype P1, otype P2 ), 207 // T3 | sumable(T3); 208 209 //otype T2(otype P1, otype P2) | sumable( T2( P1,P2 ) ) = struct { P1 i; P2 j; }; 210 211 // T2(int, int) w1; 212 // typedef T2(int, int) w2; 213 // w2 g2; 214 // otype w3 = T2(int, int); 215 // w3 g3; 216 217 int main( void ) {} 218 96 219 // Local Variables: // 97 220 // tab-width: 4 // 221 // compile-command: "cfa forall.c" // 98 222 // End: //
Note: See TracChangeset
for help on using the changeset viewer.