@@ -1555,6 +1555,32 @@ class cppfront
1555
1555
}
1556
1556
1557
1557
1558
+ // -----------------------------------------------------------------------
1559
+ //
1560
+ auto is_it_pointer_declaration (declaration_sym const * decl, int deref_cnt = 0 , int addr_cnt = 0 ) -> bool {
1561
+ if (!decl || !decl->declaration )
1562
+ return false ;
1563
+ if (addr_cnt>deref_cnt)
1564
+ return true ;
1565
+
1566
+ if (decl->declaration ->dereference ) {
1567
+ auto deref = sema.get_declaration_of (*decl->declaration ->dereference );
1568
+ return is_it_pointer_declaration (deref, deref_cnt+decl->declaration ->dereference_cnt , addr_cnt);
1569
+ } else if (decl->declaration ->address_of ) {
1570
+ auto addr = sema.get_declaration_of (*decl->declaration ->address_of );
1571
+ return is_it_pointer_declaration (addr, deref_cnt, addr_cnt+1 );
1572
+ }
1573
+
1574
+ int pointer_declarators_cnt = 0 ;
1575
+ if (auto * obj_id_expr = std::get_if<declaration_node::object>(&decl->declaration ->type )) {
1576
+ if (auto * unqual = std::get_if<id_expression_node::unqualified>(&(*obj_id_expr)->id )){
1577
+ pointer_declarators_cnt = std::ssize ((*unqual)->pointer_declarators );
1578
+ }
1579
+ }
1580
+
1581
+ return (pointer_declarators_cnt + addr_cnt - deref_cnt) > 0 ;
1582
+ };
1583
+
1558
1584
// -----------------------------------------------------------------------
1559
1585
//
1560
1586
auto emit (postfix_expression_node& n, bool for_lambda_capture = false ) -> void
@@ -1588,7 +1614,7 @@ class cppfront
1588
1614
1589
1615
// TODO: Generalize this -- for now we detect only multi-level cases of the form "p: ***int = ...;"
1590
1616
// We don't recognize pointer types that are deduced or from Cpp1
1591
- if (!unqual->pointer_declarators .empty () || is_pointer) {
1617
+ if (is_it_pointer_declaration (decl) || !unqual->pointer_declarators .empty () || is_pointer) {
1592
1618
if (n.ops .empty ()) {
1593
1619
last_postfix_expr_was_pointer = true ;
1594
1620
}
0 commit comments