Skip to content

Commit 6a7c818

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 23a6f19 commit 6a7c818

File tree

1 file changed

+27
-0
lines changed

1 file changed

+27
-0
lines changed

source/cppfront.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1564,6 +1564,33 @@ class cppfront
15641564
if (!decl || !decl->declaration)
15651565
return false;
15661566

1567+
if (auto* fun = std::get_if<declaration_node::function>(&decl->declaration->type)) {
1568+
if (auto* ret_id_expr = std::get_if<function_type_node::id>(&(*fun)->returns)) {
1569+
if (auto* unqual = std::get_if<id_expression_node::unqualified>(&(*ret_id_expr)->id)){
1570+
return is_it_pointer_declaration(*unqual, deref_cnt, addr_cnt);
1571+
}
1572+
}
1573+
}
1574+
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+
return is_it_pointer_declaration(*unqual, deref_cnt, addr_cnt);
1578+
}
1579+
}
1580+
1581+
if (decl->initializer && decl->initializer->suspicious_initialization) {
1582+
auto init_decl = sema.get_declaration_of(*decl->initializer->suspicious_initialization, true);
1583+
if (init_decl && init_decl->declaration) {
1584+
if (auto* fun = std::get_if<declaration_node::function>(&init_decl->declaration->type)) {
1585+
if (auto* ret_id_expr = std::get_if<function_type_node::id>(&(*fun)->returns)) {
1586+
if (auto* unqual = std::get_if<id_expression_node::unqualified>(&(*ret_id_expr)->id)){
1587+
return is_it_pointer_declaration(*unqual, deref_cnt, addr_cnt);
1588+
}
1589+
}
1590+
}
1591+
}
1592+
}
1593+
15671594
if (decl->declaration->dereference) {
15681595
auto deref = sema.get_declaration_of(*decl->declaration->dereference, true);
15691596
assert(deref && deref->declaration);

0 commit comments

Comments
 (0)