An imbricated exported macro leads to a segfault.
gcc/rust/ChangeLog:
* metadata/rust-export-metadata.cc (ExportContext::emit_macro):
Change method argument NodeId to AST::MacroRulesDefinition.
* metadata/rust-export-metadata.h:
Likewise.
* util/rust-hir-map.cc (Mappings::insert_exported_macro):
Insert AST::MacroRulesDefinition instead of NodeId.
* util/rust-hir-map.h:
Change methods declarations of exported macros.
gcc/testsuite/ChangeLog:
* rust/compile/issue-3617.rs: New test.
Signed-off-by: Lucas Ly Ba <lucas.ly-ba@outlook.fr>
#include "rust-ast-dump.h"
#include "rust-abi.h"
#include "rust-item.h"
+#include "rust-macro.h"
#include "rust-object-export.h"
#include "md5.h"
}
void
-ExportContext::emit_macro (NodeId macro)
+ExportContext::emit_macro (AST::MacroRulesDefinition ¯o)
{
std::stringstream oss;
AST::Dump dumper (oss);
- AST::Item *item = mappings.lookup_ast_item (macro).value ();
-
- dumper.go (*item);
+ dumper.go (macro);
public_interface_buffer += oss.str ();
}
vis_item.accept_vis (visitor);
}
- for (const auto ¯o : mappings.get_exported_macros ())
+ for (auto ¯o : mappings.get_exported_macros ())
context.emit_macro (macro);
}
* directly refer to them using their NodeId. There's no need to keep an HIR
* node for them.
*/
- void emit_macro (NodeId macro);
+ void emit_macro (AST::MacroRulesDefinition ¯o);
const std::string &get_interface_buffer () const;
void
Mappings::insert_exported_macro (AST::MacroRulesDefinition &def)
{
- exportedMacros.emplace_back (def.get_node_id ());
+ exportedMacros.emplace_back (def);
}
-std::vector<NodeId> &
+std::vector<AST::MacroRulesDefinition>
Mappings::get_exported_macros ()
{
return exportedMacros;
lookup_macro_invocation (AST::MacroInvocation &invoc);
void insert_exported_macro (AST::MacroRulesDefinition &def);
- std::vector<NodeId> &get_exported_macros ();
+ std::vector<AST::MacroRulesDefinition> get_exported_macros ();
void insert_derive_proc_macros (CrateNum num,
std::vector<CustomDeriveProcMacro> macros);
std::map<NodeId, std::pair<AST::MacroRulesDefinition *, CrateNum>>
macroMappings;
std::map<NodeId, AST::MacroRulesDefinition *> macroInvocations;
- std::vector<NodeId> exportedMacros;
+ std::vector<AST::MacroRulesDefinition> exportedMacros;
// Procedural macros
std::map<CrateNum, std::vector<CustomDeriveProcMacro>>
--- /dev/null
+macro_rules! quote_tokens {
+ () => {
+ #[macro_export]
+ macro_rules! inner {
+ () => {
+ $crate::
+ }
+ }
+ };
+}
+
+pub fn main() {
+ quote_tokens!();
+}