Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ICE]: BitwiseNot followed by a variable in a struct causes an error. #1761

Open
Subway2023 opened this issue Mar 12, 2025 · 1 comment
Open

Comments

@Subway2023
Copy link

Version: v0.3.3: v0.3.3-70-g32a45ea1
Description: Solc can compile normally. The error location in the source code can be found at the link.

contract test {
    struct ComplexType {
        bool flag;
        uint32 value32;
        uint64 value64;
    }

    function run(ComplexType memory x) public returns(uint256 y) {
        if (x.flag) y = 1;
        y = y * 0x100000000 | ~x.value32;
        y = y * 0x10000000000000000 | ~x.value64;
    }
}
thread 'main' panicked at /root/.cargo/registry/src/index.crates.io-6f17d22bba15001f/inkwell-0.4.0/src/values/enums.rs:286:13:
Found PointerValue(PointerValue { ptr_value: Value { name: "struct member1", address: 0x5a52fc9c8930, is_const: false, is_null: false, is_undef: false, llvm_value: "  %\"struct member1\" = getelementptr inbounds { i1, i32, i64 }, ptr %0, i32 0, i32 1", llvm_type: "ptr" } }) but expected the IntValue variant
stack backtrace:
   0: rust_begin_unwind
             at /rustc/7608018cbdac9e55d0d13529cf43adc33d53efcf/library/std/src/panicking.rs:665:5
   1: core::panicking::panic_fmt
             at /rustc/7608018cbdac9e55d0d13529cf43adc33d53efcf/library/core/src/panicking.rs:74:14
   2: inkwell::values::enums::BasicValueEnum::into_int_value
             at /root/.cargo/registry/src/index.crates.io-6f17d22bba15001f/inkwell-0.4.0/src/values/enums.rs:286:13
   3: solang::emit::expression::expression
             at ./src/emit/expression.rs:1312:21
   4: solang::emit::expression::expression
             at ./src/emit/expression.rs:1090:23
   5: solang::emit::expression::expression
             at ./src/emit/expression.rs:1163:21
   6: solang::emit::expression::expression
             at ./src/emit/expression.rs:1318:25
   7: solang::emit::instructions::process_instruction
             at ./src/emit/instructions.rs:78:21
   8: solang::emit::cfg::emit_cfg
             at ./src/emit/cfg.rs:211:13
   9: solang::emit::functions::emit_functions
             at ./src/emit/functions.rs:49:9
  10: solang::emit::solana::SolanaTarget::build
             at ./src/emit/solana/mod.rs:73:9
  11: solang::emit::binary::Binary::build
             at ./src/emit/binary.rs:185:31
  12: solang::emit::<impl solang::sema::ast::Contract>::binary
             at ./src/emit/mod.rs:376:9
  13: solang::contract_results
             at ./src/bin/solang.rs:414:18
  14: solang::compile
             at ./src/bin/solang.rs:272:17
  15: solang::main
             at ./src/bin/solang.rs:59:13
  16: core::ops::function::FnOnce::call_once
             at /root/.rustup/toolchains/nightly-2024-09-30-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ops/function.rs:250:5
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
@Subway2023
Copy link
Author

Similarly, using ShiftLeft,ShiftRight with a variable in a struct on the right side also causes an error.

contract C {
    struct MyStruct {
        uint256 value;
    }

    mapping(uint256 => uint256) myMapping;

    function f(MyStruct memory a, MyStruct memory b) public returns (MyStruct memory) {
        a.value <<= b.value;
        return a;
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant