Skip to content

Commit c63882a

Browse files
authored
Add compile-time support for dict.values (#2661)
* Implement `dict.values` for `DictConstant` * Tests: Add tests * Tests: Fix typing mistake * Tests: Update references * Uncomment check for modifying attribute * Tests: Update references * Delete tests/reference/asr-func_04-eef2656.stdout * Tests: Move `print` before `assert` * Tests: Update test
1 parent 6036111 commit c63882a

File tree

2 files changed

+31
-4
lines changed

2 files changed

+31
-4
lines changed

integration_tests/test_dict_keys_values.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,26 @@ def test_dict_keys_values():
7474
assert len(k_2) == 3
7575

7676

77+
# dict.values on dict constant
78+
print({1: "a"}.values())
79+
assert len({1: "a"}.values()) == 1
80+
81+
print({"a": 1, "b": 2, "c": 3}.values())
82+
assert len({"a": 1, "b": 2, "c": 3}.values()) == 3
83+
84+
print({1: [1, 2, 3], 2: [4, 5, 6], 3: [7, 8, 9]}.values())
85+
assert len({1: [1, 2, 3], 2: [4, 5, 6], 3: [7, 8, 9]}.values()) == 3
86+
87+
print({(1, 2): "a", (3, 4): "b", (5, 6): "c"}.values())
88+
assert len({(1, 2): "a", (3, 4): "b", (5, 6): "c"}.values()) == 3
89+
90+
v_1: list[list[i32]] = {"list1": [1, 2, 3], "list2": [4, 5, 6], "list3": [7, 8, 9]}.values()
91+
print(v_1)
92+
assert len(v_1) == 3
93+
94+
v_2: list[str] = {(1, 2): "a", (3, 4): "b", (5, 6): "c"}.values()
95+
print(v_2)
96+
assert len(v_2) == 3
97+
98+
7799
test_dict_keys_values()

src/libasr/pass/intrinsic_functions.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4786,10 +4786,15 @@ static inline void verify_args(const ASR::IntrinsicElementalFunction_t& x, diag:
47864786
x.base.base.loc, diagnostics);
47874787
}
47884788

4789-
static inline ASR::expr_t *eval_dict_values(Allocator &/*al*/,
4790-
const Location &/*loc*/, ASR::ttype_t *, Vec<ASR::expr_t*>& /*args*/, diag::Diagnostics& /*diag*/) {
4791-
// TODO: To be implemented for DictConstant expression
4792-
return nullptr;
4789+
static inline ASR::expr_t *eval_dict_values(Allocator &al,
4790+
const Location &loc, ASR::ttype_t *t, Vec<ASR::expr_t*>& args, diag::Diagnostics& /*diag*/) {
4791+
if (args[0] == nullptr) {
4792+
return nullptr;
4793+
}
4794+
ASR::DictConstant_t* cdict = ASR::down_cast<ASR::DictConstant_t>(args[0]);
4795+
4796+
return ASRUtils::EXPR(ASR::make_ListConstant_t(al, loc,
4797+
cdict->m_values, cdict->n_values, t));
47934798
}
47944799

47954800
static inline ASR::asr_t* create_DictValues(Allocator& al, const Location& loc,

0 commit comments

Comments
 (0)