Skip to content

Commit a04d456

Browse files
authored
Merge pull request #1768 from Shaikh-Ubaid/fix_bit_len2
ASR: Support UnaryOp in attr bit_length()
2 parents 8d09615 + 450b560 commit a04d456

File tree

3 files changed

+29
-1
lines changed

3 files changed

+29
-1
lines changed

integration_tests/test_bit_length.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,25 @@ def ff3():
2424
x = -i16(one << i16(13))
2525
assert i32(x.bit_length()) == 14
2626

27+
def ff4():
28+
print((-100).bit_length())
29+
print((-4).bit_length())
30+
31+
assert (-100).bit_length() == 7
32+
assert (-4).bit_length() == 3
33+
34+
def ff5():
35+
a: i32
36+
a = 100
37+
print((-a).bit_length())
38+
print((-(-(-(-a)))).bit_length())
39+
40+
assert (-a).bit_length() == 7
41+
assert (-(-(-(-a)))).bit_length() == 7
2742

2843
ff()
2944
ff1()
3045
ff2()
3146
ff3()
47+
ff4()
48+
ff5()

src/libasr/codegen/asr_to_c_cpp.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1604,7 +1604,7 @@ R"(#include <stdio.h>
16041604
self().visit_expr(*x.m_arg);
16051605
int expr_precedence = last_expr_precedence;
16061606
last_expr_precedence = 3;
1607-
if (expr_precedence <= last_expr_precedence) {
1607+
if (expr_precedence < last_expr_precedence) {
16081608
src = "-" + src;
16091609
} else {
16101610
src = "-(" + src + ")";

src/lpython/semantics/python_ast_to_asr.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6531,6 +6531,17 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
65316531
}
65326532
tmp = make_call_helper(al, st, current_scope, args, call_name, x.base.base.loc);
65336533
return;
6534+
} else if (AST::is_a<AST::UnaryOp_t>(*at->m_value)) {
6535+
AST::UnaryOp_t* uop = AST::down_cast<AST::UnaryOp_t>(at->m_value);
6536+
visit_UnaryOp(*uop);
6537+
Vec<ASR::expr_t*> eles;
6538+
eles.reserve(al, x.n_args);
6539+
for (size_t i=0; i<x.n_args; i++) {
6540+
eles.push_back(al, args[i].m_value);
6541+
}
6542+
ASR::expr_t* expr = ASR::down_cast<ASR::expr_t>(tmp);
6543+
handle_attribute(expr, at->m_attr, x.base.base.loc, eles);
6544+
return;
65346545
} else if (AST::is_a<AST::ConstantInt_t>(*at->m_value)) {
65356546
if (std::string(at->m_attr) == std::string("bit_length")) {
65366547
//bit_length() attribute:

0 commit comments

Comments
 (0)