File tree Expand file tree Collapse file tree 9 files changed +31
-25
lines changed Expand file tree Collapse file tree 9 files changed +31
-25
lines changed Original file line number Diff line number Diff line change @@ -231,7 +231,9 @@ class builder {
231
231
return ret_builder;
232
232
}
233
233
BT operator *(void ) {
234
- return (*this )[0 ];
234
+ auto b = (*this )[0 ];
235
+ b.block_expr ->template setMetadata <bool >(" deref_is_star" , true );
236
+ return b;
235
237
}
236
238
237
239
BT assign (const BT &a) {
Original file line number Diff line number Diff line change @@ -98,7 +98,7 @@ class dyn_var_impl : public var {
98
98
return ((builder) * this )[a];
99
99
}
100
100
builder operator *(void ) {
101
- return ((builder) * this )[ 0 ] ;
101
+ return * ((builder) * this );
102
102
}
103
103
builder operator !() {
104
104
return !(builder) * this ;
@@ -436,12 +436,14 @@ class dyn_var<T *>
436
436
return (dyn_var_mimic<T>)(cast)this ->dyn_var_impl <T *>::operator [](bt);
437
437
}
438
438
dyn_var_mimic<T> operator *() {
439
- return this ->operator []( 0 );
439
+ return (cast)( this ->dyn_var_impl <T*>:: operator *() );
440
440
}
441
441
// Hack for creating a member that's live across return site
442
442
dyn_var<T> _p = as_member(this , " _p" );
443
443
dyn_var<T> *operator ->() {
444
- _p = (cast)this ->operator [](0 );
444
+ auto b = this ->operator [](0 );
445
+ b.encompassing_expr ->template setMetadata <bool >(" deref_is_star" , true );
446
+ _p = (cast)b;
445
447
return _p.addr ();
446
448
}
447
449
};
Original file line number Diff line number Diff line change @@ -40,7 +40,7 @@ STMT_BLOCK
40
40
MEMBER_ACCESS_EXPR (member)
41
41
SQ_BKT_EXPR
42
42
VAR_EXPR
43
- VAR (g_0 )
43
+ VAR (ptr_3 )
44
44
INT_CONST (0)
45
45
INT_CONST (0)
46
46
{
@@ -50,5 +50,5 @@ STMT_BLOCK
50
50
FooT h_2 = g_0;
51
51
h_2 = g_0;
52
52
FooT* ptr_3 = (&(g_0));
53
- g_0-> member = 0;
53
+ (ptr_3[0]). member = 0;
54
54
}
Original file line number Diff line number Diff line change @@ -19,11 +19,11 @@ FUNC_DECL
19
19
SQ_BKT_EXPR
20
20
VAR_EXPR
21
21
VAR (x_0)
22
- INT_CONST (1 )
22
+ INT_CONST (0 )
23
23
INT_CONST (1)
24
24
void bar (void) {
25
25
std::vector<std::vector<int>> x_0;
26
26
x_0.resize(2);
27
- (x_0[1 ]).resize(1);
27
+ (x_0[0 ]).resize(1);
28
28
}
29
29
Original file line number Diff line number Diff line change @@ -40,7 +40,7 @@ STMT_BLOCK
40
40
MEMBER_ACCESS_EXPR (member)
41
41
SQ_BKT_EXPR
42
42
VAR_EXPR
43
- VAR (var0 )
43
+ VAR (var3 )
44
44
INT_CONST (0)
45
45
INT_CONST (0)
46
46
{
@@ -50,5 +50,5 @@ STMT_BLOCK
50
50
FooT var2 = var0;
51
51
var2 = var0;
52
52
FooT* var3 = (&(var0));
53
- var0-> member = 0;
53
+ (var3[0]). member = 0;
54
54
}
Original file line number Diff line number Diff line change @@ -19,11 +19,11 @@ FUNC_DECL
19
19
SQ_BKT_EXPR
20
20
VAR_EXPR
21
21
VAR (var0)
22
- INT_CONST (1 )
22
+ INT_CONST (0 )
23
23
INT_CONST (1)
24
24
void bar (void) {
25
25
std::vector<std::vector<int>> var0;
26
26
var0.resize(2);
27
- (var0[1 ]).resize(1);
27
+ (var0[0 ]).resize(1);
28
28
}
29
29
Original file line number Diff line number Diff line change @@ -32,7 +32,7 @@ static void bar(void) {
32
32
FooT h = g;
33
33
h = g;
34
34
dyn_var<foo_t *> ptr = &g;
35
- ((FooT)(builder::cast)g [0 ]).member = 0 ;
35
+ ((FooT)(builder::cast)ptr [0 ]).member = 0 ;
36
36
}
37
37
38
38
int main (int argc, char *argv[]) {
Original file line number Diff line number Diff line change @@ -19,7 +19,7 @@ struct vector: public builder::custom_type<T> {
19
19
static void bar (void ) {
20
20
dyn_var<vector<vector<int >>> x;
21
21
x.resize (2 );
22
- x[1 ].resize (1 );
22
+ x[0 ].resize (1 );
23
23
}
24
24
25
25
int main (int argc, char *argv[]) {
Original file line number Diff line number Diff line change @@ -576,18 +576,20 @@ void c_code_generator::visit(return_stmt::Ptr a) {
576
576
void c_code_generator::visit (member_access_expr::Ptr a) {
577
577
if (isa<sq_bkt_expr>(a->parent_expr )) {
578
578
sq_bkt_expr::Ptr parent = to<sq_bkt_expr>(a->parent_expr );
579
- if (isa<int_const>(parent->index )) {
580
- auto index = to<int_const>(parent->index );
581
- if (index->value == 0 ) {
582
- if (!isa<var_expr>(parent->var_expr )) {
583
- oss << " (" ;
579
+ if (parent->getBoolMetadata (" deref_is_star" )) {
580
+ if (isa<int_const>(parent->index )) {
581
+ auto index = to<int_const>(parent->index );
582
+ if (index->value == 0 ) {
583
+ if (!isa<var_expr>(parent->var_expr )) {
584
+ oss << " (" ;
585
+ }
586
+ parent->var_expr ->accept (this );
587
+ if (!isa<var_expr>(parent->var_expr )) {
588
+ oss << " )" ;
589
+ }
590
+ oss << " ->" << a->member_name ;
591
+ return ;
584
592
}
585
- parent->var_expr ->accept (this );
586
- if (!isa<var_expr>(parent->var_expr )) {
587
- oss << " )" ;
588
- }
589
- oss << " ->" << a->member_name ;
590
- return ;
591
593
}
592
594
}
593
595
}
You can’t perform that action at this time.
0 commit comments