source: tests/zombies/withStatement.cfa@ bbbff10

Last change on this file since bbbff10 was fd54fef, checked in by Michael Brooks <mlbrooks@…>, 5 years ago

Converting the project to use the new syntax for otype, dtype and ttytpe.

Changed prelude (gen), libcfa and test suite to use it. Added a simple deprecation rule of the old syntax to the parser; we might wish to support both syntaxes "officially," like with an extra CLI switch, but this measure should serve as a simple reminder for our team to try the new syntax.

  • Property mode set to 100644
File size: 1.9 KB
Line 
1//
2// Cforall Version 1.0.0 Copyright (C) 2017 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// tupleFunction.c --
8//
9// Author : Rob Schluntz
10// Created On : Mon Dec 04 17:41:45 2017
11// Last Modified By : Peter A. Buhr
12// Last Modified On : Mon Dec 24 19:08:18 2018
13// Update Count : 5
14//
15
16#include <fstream.hfa>
17
18struct S {
19 int i;
20 // dynamically allocated member ensures ctor/dtors are called correctly on temporaries
21 int * ptr;
22};
23
24// with clause on reference parameter
25void ?{}( S & this, int n ) with( this ) {
26 i = n;
27 ptr = (int *)malloc( sizeof(int) );
28}
29
30void ?{}( S & this ) {
31 this{ 0 };
32}
33
34void ?{}( S & this, S other ) {
35 this{ other.i };
36}
37
38S ?=?( S & this, S other ) with( this ) {
39 i = other.i;
40 *ptr = *other.ptr;
41 return this;
42}
43
44void ^?{}( S & this ) with( this ) {
45 free( ptr );
46}
47
48struct S2 {
49 S s;
50};
51
52void ?{}( S2 & this, int n ) {
53 (this.s){ n };
54}
55
56forall( T )
57struct Box {
58 T x;
59};
60
61forall( T )
62void ?{}( Box(T) & this ) with( this ) { // with clause in polymorphic function
63 x{};
64}
65
66void print( int i ) { sout | i; }
67
68forall( T | { void print( T ); })
69void foo( T t ) {
70 Box( T ) b = { t };
71 with( b ) { // with statement in polymorphic function
72 print( x );
73 }
74}
75
76// ensure with-statement temporary generation works correctly
77S mk() {
78 sout | "called mk";
79 return (S){ 444 };
80}
81
82// ensure with-statement temporary generation with reference-returning functions works correctly
83S & ref() {
84 static S var = { 123456789 };
85 return var;
86}
87
88int main() {
89 S2 s2 = { 12345 };
90 with ( s2) {
91 with( s ) { // with s2.s
92 sout | i | s.i | s2.s.i;
93 foo( i ); // s.i
94 with( mk()) {
95 sout | i | i | i;
96 with( ref()) {
97 sout | i | i | i;
98 } // with ref()
99 with( ref()) {
100 sout | i | i | i;
101 } // with ref()
102 } // with mk()
103 } // with s
104 } // with s2
105}
106
107// Local Variables: //
108// tab-width: 4 //
109// End: //
Note: See TracBrowser for help on using the repository browser.