Skip to content

segfault in clone_pattern w macro #4140

@matthiaskrgr

Description

@matthiaskrgr

auto-reduced (treereduce-rust):

//@compile-flags: -frust-incomplete-and-experimental-compiler-do-not-use
macro_rules! ty_app {
    ($_a:pat) => {
        ($ctor)
    };
}

pub fn foo() {
    match ty {
        ty_app!(bean::Array) => {}
    }
}

original:

pub enum TypeCtor {
    Slice,
    Array,
}
pub struct B<T>(T);

macro_rules! ty_app {
    ($_a:pat) => {
        ApplicationTy($ctor)
    };
}

pub fn foo(ty: ApplicationTy) {
    match ty {
        ty_app!(bean::Array) => {}
    }
}

Version information:

c742973

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

Program output

/tmp/icemaker_global_tempdir.jLLtoE9fZU30/rustc_testrunner_tmpdir_reporting.aqGFvJ5Bn6sj/mvce.rs:3:10: error: unrecognised token ‘$’ in grouped or tuple pattern after first pattern
    3 |         ($ctor)
      |          ^
crab1: internal compiler error: Segmentation fault
0x300c7d8 internal_error(char const*, ...)
	../../gcc/diagnostic-global-context.cc:534
0x199d0df crash_signal
	../../gcc/toplev.cc:323
0xde2ec4 Rust::AST::Pattern::clone_pattern() const
	../../gcc/rust/ast/rust-ast.h:1427
0xde2ec4 Rust::AST::SingleASTNode::SingleASTNode(Rust::AST::SingleASTNode const&)
	../../gcc/rust/ast/rust-ast.cc:76
0xea7605 void std::_Construct<Rust::AST::SingleASTNode, Rust::AST::SingleASTNode const&>(Rust::AST::SingleASTNode*, Rust::AST::SingleASTNode const&)
	/usr/include/c++/15.2.1/bits/stl_construct.h:133
0xea7605 Rust::AST::SingleASTNode* std::__do_uninit_copy<Rust::AST::SingleASTNode const*, Rust::AST::SingleASTNode const*, Rust::AST::SingleASTNode*>(Rust::AST::SingleASTNode const*, Rust::AST::SingleASTNode const*, Rust::AST::SingleASTNode*)
	/usr/include/c++/15.2.1/bits/stl_uninitialized.h:145
0xea7605 Rust::AST::SingleASTNode* std::uninitialized_copy<Rust::AST::SingleASTNode const*, Rust::AST::SingleASTNode*>(Rust::AST::SingleASTNode const*, Rust::AST::SingleASTNode const*, Rust::AST::SingleASTNode*)
	/usr/include/c++/15.2.1/bits/stl_uninitialized.h:266
0xea7605 Rust::AST::SingleASTNode* std::__uninitialized_copy_a<Rust::AST::SingleASTNode const*, Rust::AST::SingleASTNode const*, Rust::AST::SingleASTNode*, Rust::AST::SingleASTNode>(Rust::AST::SingleASTNode const*, Rust::AST::SingleASTNode const*, Rust::AST::SingleASTNode*, std::allocator<Rust::AST::SingleASTNode>&)
	/usr/include/c++/15.2.1/bits/stl_uninitialized.h:637
0xea7605 void std::vector<Rust::AST::SingleASTNode, std::allocator<Rust::AST::SingleASTNode> >::_M_range_initialize_n<Rust::AST::SingleASTNode const*, Rust::AST::SingleASTNode const*>(Rust::AST::SingleASTNode const*, Rust::AST::SingleASTNode const*, unsigned long)
	/usr/include/c++/15.2.1/bits/stl_vector.h:1989
0xea7605 std::vector<Rust::AST::SingleASTNode, std::allocator<Rust::AST::SingleASTNode> >::vector(std::initializer_list<Rust::AST::SingleASTNode>, std::allocator<Rust::AST::SingleASTNode> const&)
	/usr/include/c++/15.2.1/bits/stl_vector.h:712
0xea7605 transcribe_pattern
	../../gcc/rust/expand/rust-macro-expand.cc:1021
0xea7605 transcribe_context
	../../gcc/rust/expand/rust-macro-expand.cc:1066
0xea7605 Rust::MacroExpander::transcribe_rule(Rust::AST::MacroRulesDefinition&, Rust::AST::MacroRule&, Rust::AST::DelimTokenTree&, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, Rust::MatchedFragmentContainer*, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, Rust::MatchedFragmentContainer*> > >&, Rust::AST::InvocKind, Rust::MacroExpander::ContextType)
	../../gcc/rust/expand/rust-macro-expand.cc:1152
0xeaa284 Rust::MacroExpander::expand_decl_macro(unsigned long, Rust::AST::MacroInvocData&, Rust::AST::MacroRulesDefinition&, Rust::AST::InvocKind)
	../../gcc/rust/expand/rust-macro-expand.cc:128
0xeaa728 Rust::MacroExpander::expand_invoc(Rust::AST::MacroInvocation&, Rust::AST::InvocKind)
	../../gcc/rust/expand/rust-macro-expand.cc:330
0xeb791f Rust::ExpandVisitor::maybe_expand_pattern(std::unique_ptr<Rust::AST::Pattern, std::default_delete<Rust::AST::Pattern> >&)
	../../gcc/rust/expand/rust-expand-visitor.cc:391
0xeb7b6e Rust::ExpandVisitor::visit(Rust::AST::MatchExpr&)
	../../gcc/rust/expand/rust-expand-visitor.cc:752
0xeb67df Rust::ExpandVisitor::maybe_expand_expr(std::unique_ptr<Rust::AST::Expr, std::default_delete<Rust::AST::Expr> >&)
	../../gcc/rust/expand/rust-expand-visitor.cc:337
0xeb94fe void Rust::ExpandVisitor::expand_macro_children<std::vector<std::unique_ptr<Rust::AST::Item, std::default_delete<Rust::AST::Item> >, std::allocator<std::unique_ptr<Rust::AST::Item, std::default_delete<Rust::AST::Item> > > >, std::unique_ptr<Rust::AST::Item, std::default_delete<Rust::AST::Item> > >(std::vector<std::unique_ptr<Rust::AST::Item, std::default_delete<Rust::AST::Item> >, std::allocator<std::unique_ptr<Rust::AST::Item, std::default_delete<Rust::AST::Item> > > >&, std::unique_ptr<Rust::AST::Item, std::default_delete<Rust::AST::Item> > (Rust::AST::SingleASTNode::*)())
	../../gcc/rust/expand/rust-expand-visitor.h:134
0xeb94fe Rust::ExpandVisitor::expand_inner_items(std::vector<std::unique_ptr<Rust::AST::Item, std::default_delete<Rust::AST::Item> >, std::allocator<std::unique_ptr<Rust::AST::Item, std::default_delete<Rust::AST::Item> > > >&)
	../../gcc/rust/expand/rust-expand-visitor.cc:237
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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions