Rust-GCC / Rust-GCC/gccrs

ICE in parse_reg_operand_const, at rust/expand/rust-macro-builtins-asm.cc (globalasm)

Open
#4,615 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug
Dominant language
C++
Stars
2.9k
Forks
231
Avg merge
19h 55m
Merged PRs (30d)
67

Description

auto-reduced (treereduce-rust):

//@compile-flags: -frust-incomplete-and-experimental-compiler-do-not-use
#![no_core]

#[rustc_builtin_macro]

macro_rules! global_asm {
    () => {};
}

global_asm!("{1}", a = const FOO);

original code

original:

#![feature(no_core)]
#![no_core]
// revisions: x86_64 aarch64

// [x86_64] compile-flags: --target x86_64-unknown-linux-gnu
// [aarch64] compile-flags: --target aarch64-unknown-linux-gnu

// [x86_64] needs-llvm-components: x86
// [aarch64] needs-llvm-components: aarch64

#![feature(no_core, lang_items, rustc_attrs, asm_const)]
#![no_core]

#[rustc_builtin_macro]
macro_rules! asm {
    () => {};
}
#[rustc_builtin_macro]
macro_rules! global_asm {
    () => {};
}

#[lang = "sized"]
trait Sized {}

fn main() {
    let mut foo = 0;
    unsafe {
        asm!("{}");
        //~^ ERROR invalid reference to argument at index 0
        asm!("{1}", in(reg) foo);
        //~^ ERROR invalid reference to argument at index 1
        //~^^ ERROR argument never used
        asm!("{a}");
        //~^ ERROR there is no argument named `a`
        asm!("{}", a = in(reg) foo);
        //~^ ERROR invalid reference to argument at index 0
        //~^^ ERROR argument never used
        asm!("{1}", a = in(reg) foo);
        //~^ ERROR invalid reference to argument at index 1
        //~^^ ERROR named argument never used
        #[cfg(any(x86_64))]
        asm!("{}", in("eax") foo);
        //[x86_64]~^ ERROR invalid reference to argument at index 0
        #[cfg(any(aarch64))]
        asm!("{}", in("x0") foo);
        //[aarch64]~^ ERROR invalid reference to argument at index 0
        asm!("{:foo}", in(reg) foo);
        //~^ ERROR asm template modifier must be a single character
        //~| WARN formatting may not be suitable for sub-register argument [asm_sub_register]
        asm!("", in(reg) 0, in(reg) 1);
        //~^ ERROR multiple unused asm arguments
    }
}

const FOO: i32 = 1;
global_asm!("{}");
//~^ ERROR invalid reference to argument at index 0
global_asm!("{1}", const FOO);
//~^ ERROR invalid reference to argument at index 1
//~^^ ERROR argument never used
global_asm!("{a}");
//~^ ERROR there is no argument named `a`
global_asm!("{}", a = const FOO);
//~^ ERROR invalid reference to argument at index 0
//~^^ ERROR argument never used
global_asm!("{1}", a = const FOO);
//~^ ERROR invalid reference to argument at index 1
//~^^ ERROR named argument never used
global_asm!("{:foo}", const FOO);
//~^ ERROR asm template modifier must be a single character
global_asm!("", const FOO, const FOO);
//~^ ERROR multiple unused asm arguments

Version information:

696cb485cfa9969c952d6765889d82ed548ca15c

Possibly related line of code:
https://github.com/Rust-GCC/gccrs/blob/696cb485cfa9969c952d6765889d82ed548ca15c/gcc/rust/expand/rust-macro-builtins-asm.cc#L460-L472

Command:
/home/matthias/vcs/github/gccrs/gccrs-build/gcc/crab1 -frust-incomplete-and-experimental-compiler-do-not-use

Program output

crab1: internal compiler error: in parse_reg_operand_const, at rust/expand/rust-macro-builtins-asm.cc:466
0x32c0107 internal_error(char const*, ...)
	../../gcc/diagnostic-global-context.cc:787
0xc7e0b1 fancy_abort(char const*, int, char const*)
	../../gcc/diagnostics/context.cc:1813
0xf3cb2a Rust::parse_reg_operand_const(Rust::InlineAsmContext)
	../../gcc/rust/expand/rust-macro-builtins-asm.cc:466
0xf3cb2a Rust::parse_reg_operand_const(Rust::InlineAsmContext)
	../../gcc/rust/expand/rust-macro-builtins-asm.cc:459
0xf3e4ff decltype (((forward<tl::expected<Rust::InlineAsmContext, Rust::InlineAsmParseError> (* const&)(Rust::InlineAsmContext)>)({parm#1}))((forward<Rust::InlineAsmContext&>)({parm#2}))) tl::detail::invoke<tl::expected<Rust::InlineAsmContext, Rust::InlineAsmParseError> (* const&)(Rust::InlineAsmContext), Rust::InlineAsmContext&, void>(tl::expected<Rust::InlineAsmContext, Rust::InlineAsmParseError> (* const&)(Rust::InlineAsmContext), Rust::InlineAsmContext&)
	../../gcc/rust/util/expected.h:292
0xf3e4ff auto tl::detail::and_then_impl<tl::expected<Rust::InlineAsmContext, Rust::InlineAsmParseError>&, tl::expected<Rust::InlineAsmContext, Rust::InlineAsmParseError> (* const&)(Rust::InlineAsmContext), (void*)0, tl::expected<Rust::InlineAsmContext, Rust::InlineAsmParseError> >(tl::expected<Rust::InlineAsmContext, Rust::InlineAsmParseError>&, tl::expected<Rust::InlineAsmContext, Rust::InlineAsmParseError> (* const&)(Rust::InlineAsmContext))
	../../gcc/rust/util/expected.h:2053
0xf3e4ff auto tl::expected<Rust::InlineAsmContext, Rust::InlineAsmParseError>::and_then<tl::expected<Rust::InlineAsmContext, Rust::InlineAsmParseError> (* const&)(Rust::InlineAsmContext)>(tl::expected<Rust::InlineAsmContext, Rust::InlineAsmParseError> (* const&)(Rust::InlineAsmContext)) &
	../../gcc/rust/util/expected.h:1287
0xf3e4ff Rust::parse_reg_operand(Rust::InlineAsmContext)
	../../gcc/rust/expand/rust-macro-builtins-asm.cc:248
0xf40724 Rust::parse_asm_arg(Rust::InlineAsmContext)
	../../gcc/rust/expand/rust-macro-builtins-asm.cc:755
0xf42587 decltype (((forward<tl::expected<Rust::InlineAsmContext, Rust::InlineAsmParseError> (&)(Rust::InlineAsmContext)>)({parm#1}))((forward<Rust::InlineAsmContext>)({parm#2}))) tl::detail::invoke<tl::expected<Rust::InlineAsmContext, Rust::InlineAsmParseError> (&)(Rust::InlineAsmContext), Rust::InlineAsmContext, void>(tl::expected<Rust::InlineAsmContext, Rust::InlineAsmParseError> (&)(Rust::InlineAsmContext), Rust::InlineAsmContext&&)
	../../gcc/rust/util/expected.h:292
0xf42587 auto tl::detail::and_then_impl<tl::expected<Rust::InlineAsmContext, Rust::InlineAsmParseError>, tl::expected<Rust::InlineAsmContext, Rust::InlineAsmParseError> (&)(Rust::InlineAsmContext), (void*)0, tl::expected<Rust::InlineAsmContext, Rust::InlineAsmParseError> >(tl::expected<Rust::InlineAsmContext, Rust::InlineAsmParseError>&&, tl::expected<Rust::InlineAsmContext, Rust::InlineAsmParseError> (&)(Rust::InlineAsmContext))
	../../gcc/rust/util/expected.h:2053
0xf42587 auto tl::expected<Rust::InlineAsmContext, Rust::InlineAsmParseError>::and_then<tl::expected<Rust::InlineAsmContext, Rust::InlineAsmParseError> (&)(Rust::InlineAsmContext)>(tl::expected<Rust::InlineAsmContext, Rust::InlineAsmParseError> (&)(Rust::InlineAsmContext)) &&
	../../gcc/rust/util/expected.h:1290
0xf42587 Rust::parse_asm(unsigned long, Rust::AST::MacroInvocData&, Rust::AST::InvocKind, Rust::AST::AsmKind)
	../../gcc/rust/expand/rust-macro-builtins-asm.cc:874
0xf42bea Rust::MacroBuiltin::asm_handler(unsigned long, Rust::AST::MacroInvocData&, Rust::AST::InvocKind, Rust::AST::AsmKind)
	../../gcc/rust/expand/rust-macro-builtins-asm.cc:660
0xf384fc operator()
	../../gcc/rust/expand/rust-macro-builtins.cc:101
0xf384fc __invoke_impl<tl::optional<Rust::AST::Fragment>, Rust::inline_asm_maker(AST::AsmKind)::<lambda(location_t, Rust::AST::MacroInvocData&, Rust::AST::InvocKind)>&, long unsigned int, Rust::AST::MacroInvocData&, Rust::AST::InvocKind>
	/usr/include/c++/16.1.1/bits/invoke.h:63
0xf384fc __invoke_r<tl::optional<Rust::AST::Fragment>, Rust::inline_asm_maker(AST::AsmKind)::<lambda(location_t, Rust::AST::MacroInvocData&, Rust::AST::InvocKind)>&, long unsigned int, Rust::AST::MacroInvocData&, Rust::AST::InvocKind>
	/usr/include/c++/16.1.1/bits/invoke.h:118
0xf384fc _M_invoke
	/usr/include/c++/16.1.1/bits/std_function.h:296
0xeef774 std::function<tl::optional<Rust::AST::Fragment> (unsigned long, Rust::AST::MacroInvocData&, Rust::AST::InvocKind)>::operator()(unsigned long, Rust::AST::MacroInvocData&, Rust::AST::InvocKind) const
	/usr/include/c++/16.1.1/bits/std_function.h:581
0xeef774 Rust::MacroExpander::expand_invoc(Rust::AST::MacroInvocation&, Rust::AST::InvocKind)
	../../gcc/rust/expand/rust-macro-expand.cc:328
/home/matthias/vcs/github/gccrs/gccrs-build/gcc/crab1 /tmp/icemaker_global_tempdir.mvX4OLoQFu8L/rustc_testrunner_tmpdir_reporting.W7egw7u01RoS/mvce.rs -o/tmp/icemaker_global_tempdir.mvX4OLoQFu8L/rustc_testrunner_tmpdir_reporting.W7egw7u01RoS/binaryname -frust-incomplete-and-experimental-compiler-do-not-use
Please submit a full bug report, with preprocessed source (by using -freport-bug).
Please include the complete backtrace with any bug report.
See <https://gcc.gnu.org/bugs/> for instructions.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the reduced Rust reproducer in the issue and inspect parse_reg_operand_const in gcc/rust/expand/rust-macro-builtins-asm.cc around lines 460-472. Re-run crab1 with the shown flag and confirm the global_asm! input no longer triggers an internal compiler error, while the relevant invalid-argument diagnostic is preserved.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp, rust
Domain
compilers
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
55/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.