From 65697b795dfdc8ca8d6b528349e2851692d90eca Mon Sep 17 00:00:00 2001 From: Niclas Date: Mon, 8 Jun 2026 20:45:19 +0200 Subject: [PATCH] fix: parse qualified explicit destructor calls A qualified destructor-id in an explicit destructor call via `->`/`.`, e.g. `p->std::vector::~vector()` or `p->A::~A()`, produced an ERROR node. `qualified_identifier` already accepts a trailing `destructor_name`, but `qualified_field_identifier` (the member-access path) did not; mirror it there. --- grammar.js | 1 + test/corpus/expressions.txt | 60 +++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/grammar.js b/grammar.js index 36d2343..180b598 100644 --- a/grammar.js +++ b/grammar.js @@ -1415,6 +1415,7 @@ module.exports = grammar(C, { alias($.dependent_field_identifier, $.dependent_name), alias($.qualified_field_identifier, $.qualified_identifier), $.template_method, + $.destructor_name, prec.dynamic(2, $._field_identifier), )), ), diff --git a/test/corpus/expressions.txt b/test/corpus/expressions.txt index b627515..8209292 100644 --- a/test/corpus/expressions.txt +++ b/test/corpus/expressions.txt @@ -1779,3 +1779,63 @@ int main() { (type_descriptor (primitive_type)))))))) (argument_list)))))) + +================================================================================ +Qualified explicit destructor calls +================================================================================ + +int main() { + p->std::vector::~vector(); + q->A::~A(); + r->A::~A(); +} + +-------------------------------------------------------------------------------- + +(translation_unit + (function_definition + (primitive_type) + (function_declarator + (identifier) + (parameter_list)) + (compound_statement + (expression_statement + (call_expression + (field_expression + (identifier) + (qualified_identifier + (namespace_identifier) + (qualified_identifier + (template_type + (type_identifier) + (template_argument_list + (type_descriptor + (primitive_type)))) + (destructor_name + (identifier))))) + (argument_list))) + (expression_statement + (call_expression + (field_expression + (identifier) + (qualified_identifier + (namespace_identifier) + (destructor_name + (identifier)))) + (argument_list))) + (expression_statement + (call_expression + (field_expression + (identifier) + (qualified_identifier + (template_type + (type_identifier) + (template_argument_list + (type_descriptor + (primitive_type)))) + (destructor_name + (identifier) + (template_argument_list + (type_descriptor + (primitive_type)))))) + (argument_list))))))