Skip to content

Commit aafe492

Browse files
committed
Add analysis of cpp2 declarations to check if deal with pointer type
Thanks to relocating pointer_declarators this change introduce deduction of pointer types also from functions - if function or variable is defined in cpp2 then cppfront has all information to deduce the proper type during compilation.
1 parent a9ef009 commit aafe492

File tree

1 file changed

+28
-10
lines changed

1 file changed

+28
-10
lines changed

source/cppfront.cpp

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1568,6 +1568,33 @@ class cppfront
15681568
if (!decl || !decl->declaration)
15691569
return addr_cnt > deref_cnt;
15701570

1571+
if (auto* fun = std::get_if<declaration_node::function>(&decl->declaration->type)) {
1572+
if (auto* ret_id_expr = std::get_if<function_type_node::id>(&(*fun)->returns)) {
1573+
if (auto* unqual = std::get_if<id_expression_node::unqualified>(&(*ret_id_expr)->id)){
1574+
return is_it_pointer_declaration(*unqual, deref_cnt, addr_cnt);
1575+
}
1576+
}
1577+
}
1578+
1579+
if (auto* obj_id_expr = std::get_if<declaration_node::object>(&decl->declaration->type)) {
1580+
if (auto* unqual = std::get_if<id_expression_node::unqualified>(&(*obj_id_expr)->id)){
1581+
return is_it_pointer_declaration(*unqual, deref_cnt, addr_cnt);
1582+
}
1583+
}
1584+
1585+
if (decl->initializer && decl->initializer->suspicious_initialization) {
1586+
auto init_decl = sema.get_declaration_of(*decl->initializer->suspicious_initialization, true);
1587+
if (init_decl && init_decl->declaration) {
1588+
if (auto* fun = std::get_if<declaration_node::function>(&init_decl->declaration->type)) {
1589+
if (auto* ret_id_expr = std::get_if<function_type_node::id>(&(*fun)->returns)) {
1590+
if (auto* unqual = std::get_if<id_expression_node::unqualified>(&(*ret_id_expr)->id)){
1591+
return is_it_pointer_declaration(*unqual, deref_cnt, addr_cnt);
1592+
}
1593+
}
1594+
}
1595+
}
1596+
}
1597+
15711598
if (decl->declaration->dereference) {
15721599
auto deref = sema.get_declaration_of(*decl->declaration->dereference, true);
15731600
assert(deref && deref->declaration);
@@ -1604,18 +1631,9 @@ class cppfront
16041631
assert(unqual);
16051632
auto decl = sema.get_declaration_of(*unqual->identifier, true);
16061633

1607-
bool is_pointer = false;
1608-
if (decl && decl->declaration) {
1609-
if (auto* obj_id_expr = std::get_if<declaration_node::object>(&decl->declaration->type)) {
1610-
if (auto* unqual = std::get_if<id_expression_node::unqualified>(&(*obj_id_expr)->id)){
1611-
is_pointer = !(*unqual)->pointer_declarators.empty();
1612-
}
1613-
}
1614-
}
1615-
16161634
// if initialized by something suspicious (that we have no information about) we need to add cpp1 safety checks
16171635
add_safetycheck = !decl && needs_safetycheck;
1618-
if (is_it_pointer_declaration(unqual) || !unqual->pointer_declarators.empty() || is_pointer) {
1636+
if (is_it_pointer_declaration(unqual)) {
16191637
if (n.ops.empty()) {
16201638
last_postfix_expr_was_pointer = true;
16211639
}

0 commit comments

Comments
 (0)