Skip to content

Commit c74cd27

Browse files
Merge pull request #87 from AjayBrahmakshatriya/master
Fixed promotion of [0] to * and -> only in specific cases
2 parents d7852a3 + 2cb815d commit c74cd27

File tree

9 files changed

+31
-25
lines changed

9 files changed

+31
-25
lines changed

include/builder/builder_base.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,9 @@ class builder {
231231
return ret_builder;
232232
}
233233
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;
235237
}
236238

237239
BT assign(const BT &a) {

include/builder/dyn_var.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ class dyn_var_impl : public var {
9898
return ((builder) * this)[a];
9999
}
100100
builder operator*(void) {
101-
return ((builder) * this)[0];
101+
return *((builder) * this);
102102
}
103103
builder operator!() {
104104
return !(builder) * this;
@@ -436,12 +436,14 @@ class dyn_var<T *>
436436
return (dyn_var_mimic<T>)(cast)this->dyn_var_impl<T *>::operator[](bt);
437437
}
438438
dyn_var_mimic<T> operator*() {
439-
return this->operator[](0);
439+
return (cast)(this->dyn_var_impl<T*>::operator*());
440440
}
441441
// Hack for creating a member that's live across return site
442442
dyn_var<T> _p = as_member(this, "_p");
443443
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;
445447
return _p.addr();
446448
}
447449
};

samples/outputs.var_names/sample33

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ STMT_BLOCK
4040
MEMBER_ACCESS_EXPR (member)
4141
SQ_BKT_EXPR
4242
VAR_EXPR
43-
VAR (g_0)
43+
VAR (ptr_3)
4444
INT_CONST (0)
4545
INT_CONST (0)
4646
{
@@ -50,5 +50,5 @@ STMT_BLOCK
5050
FooT h_2 = g_0;
5151
h_2 = g_0;
5252
FooT* ptr_3 = (&(g_0));
53-
g_0->member = 0;
53+
(ptr_3[0]).member = 0;
5454
}

samples/outputs.var_names/sample59

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@ FUNC_DECL
1919
SQ_BKT_EXPR
2020
VAR_EXPR
2121
VAR (x_0)
22-
INT_CONST (1)
22+
INT_CONST (0)
2323
INT_CONST (1)
2424
void bar (void) {
2525
std::vector<std::vector<int>> x_0;
2626
x_0.resize(2);
27-
(x_0[1]).resize(1);
27+
(x_0[0]).resize(1);
2828
}
2929

samples/outputs/sample33

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ STMT_BLOCK
4040
MEMBER_ACCESS_EXPR (member)
4141
SQ_BKT_EXPR
4242
VAR_EXPR
43-
VAR (var0)
43+
VAR (var3)
4444
INT_CONST (0)
4545
INT_CONST (0)
4646
{
@@ -50,5 +50,5 @@ STMT_BLOCK
5050
FooT var2 = var0;
5151
var2 = var0;
5252
FooT* var3 = (&(var0));
53-
var0->member = 0;
53+
(var3[0]).member = 0;
5454
}

samples/outputs/sample59

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@ FUNC_DECL
1919
SQ_BKT_EXPR
2020
VAR_EXPR
2121
VAR (var0)
22-
INT_CONST (1)
22+
INT_CONST (0)
2323
INT_CONST (1)
2424
void bar (void) {
2525
std::vector<std::vector<int>> var0;
2626
var0.resize(2);
27-
(var0[1]).resize(1);
27+
(var0[0]).resize(1);
2828
}
2929

samples/sample33.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ static void bar(void) {
3232
FooT h = g;
3333
h = g;
3434
dyn_var<foo_t *> ptr = &g;
35-
((FooT)(builder::cast)g[0]).member = 0;
35+
((FooT)(builder::cast)ptr[0]).member = 0;
3636
}
3737

3838
int main(int argc, char *argv[]) {

samples/sample59.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ struct vector: public builder::custom_type<T> {
1919
static void bar(void) {
2020
dyn_var<vector<vector<int>>> x;
2121
x.resize(2);
22-
x[1].resize(1);
22+
x[0].resize(1);
2323
}
2424

2525
int main(int argc, char *argv[]) {

src/blocks/c_code_generator.cpp

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -576,18 +576,20 @@ void c_code_generator::visit(return_stmt::Ptr a) {
576576
void c_code_generator::visit(member_access_expr::Ptr a) {
577577
if (isa<sq_bkt_expr>(a->parent_expr)) {
578578
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;
584592
}
585-
parent->var_expr->accept(this);
586-
if (!isa<var_expr>(parent->var_expr)) {
587-
oss << ")";
588-
}
589-
oss << "->" << a->member_name;
590-
return;
591593
}
592594
}
593595
}

0 commit comments

Comments
 (0)