Skip to content

Polonius investigation #16

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 5,590 commits into
base: polonius-investigation
Choose a base branch
from

Conversation

jdupak
Copy link

@jdupak jdupak commented Oct 9, 2023

Thank you for making Rust GCC better!

If your PR fixes an issue, you can add "Fixes #issue_number" into this
PR description and the git commit message. This way the issue will be
automatically closed when your PR is merged. If your change addresses
an issue but does not fully fix it please mark it as "Addresses #issue_number"
in the git commit message.

Here is a checklist to help you with your PR.

Note that you can skip the above if you are just opening a WIP PR in
order to get feedback.

*Please write a comment explaining your change. This is the message
that will be part of the merge commit.

P-E-P and others added 30 commits July 27, 2023 09:39
Remove the NodeId member from identifiers. This member did not make
sense and was solely used for procedural macros.

gcc/rust/ChangeLog:

	* ast/rust-ast.h: Remove NodeId from identifiers.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
An error should be emitted when a proc_macro, proc_macro_attribute or
proc_macro_derive attribute is met on any non function item. Those
attribute shall be placed only on bare functions.

gcc/rust/ChangeLog:

	* util/rust-attributes.cc (is_proc_macro_type): Add function to
	identify matching proc macro attribute type.
	(check_proc_macro_non_function): Add function to check and emit
	error.
	(AttributeChecker::visit): Add cal to new check function.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
Add a bunch of test cases to avoid regressions on attribute error
message.

gcc/testsuite/ChangeLog:

	* rust/compile/proc_macro_non_function.rs: New test.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
Add a bunch of test case to avoid regressions on proc_macro_attribute
attribute error messages.

gcc/testsuite/ChangeLog:

	* rust/compile/proc_macro_attribute_non_function.rs: New test.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
Add a bunch of test cases to avoid regressions on proc_macro_derive
attribute errors when placed on any non function item.

gcc/testsuite/ChangeLog:

	* rust/compile/proc_macro_derive_non_function.rs: New test.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
Proc macro crates cannot have any public function but proc macros. Proc
macros should be public.

gcc/rust/ChangeLog:

	* checks/errors/privacy/rust-privacy-reporter.cc (PrivacyReporter::go):
	Add visibility verification.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
Add some tests to prevent regression on private procedural macros error
messages.

gcc/testsuite/ChangeLog:

	* rust/compile/proc_macro_attribute_private.rs: New test.
	* rust/compile/proc_macro_derive_private.rs: New test.
	* rust/compile/proc_macro_private.rs: New test.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
Some test were using dg-excess-errors instead of dg-error, this is now
fixed.

gcc/testsuite/ChangeLog:

	* rust/compile/proc_macro_attribute_crate_type.rs: Replace
	dg-excess-errors with dg-error and fix the line so the test
	can pass.
	* rust/compile/proc_macro_crate_type.rs: Likewise.
	* rust/compile/proc_macro_derive_crate_type.rs: Likewise.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
Crates of type 'proc-macro' should not have any other pub member than
procedural macros. These new test will avoid regression on error
messages in such sitation.

gcc/testsuite/ChangeLog:

	* rust/compile/proc_macro_pub_function.rs: New test.
	* rust/compile/proc_macro_pub_module.rs: New test.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
Refactor proc macro specific privacy check in multiple shorter
functions.

gcc/rust/ChangeLog:

	* checks/errors/privacy/rust-privacy-reporter.cc (find_proc_macro_attribute):
	Add a new function to find a potential proc macro type
	attribute on a given item.
	(proc_macro_privacy_check): Move all proc macro privacy check in
	their own function to avoid cluttering the usual privacy check.
	(PrivacyReporter::go): Add call to newly created proc macro
	privacy check function.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
Refactor attribute search with early return. Also fix the optional
building an object with it's default empty constructor by explicitely
using tl::null_opt.

gcc/rust/ChangeLog:

	* checks/errors/privacy/rust-privacy-reporter.cc (find_proc_macro_attribute):
	Refactor the function to be safer and more efficient.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
The symbol had a different convention from rust standard naming
convention (?) hence the change before adding new callback.

gcc/rust/ChangeLog:

	* expand/rust-proc-macro.cc (load_macros_array): Symbol rename.

ChangeLog:

	* libgrust/libproc_macro/proc_macro.cc (Procmacro::make_bang):
	Change symbol name.
	* libgrust/libproc_macro/registration.h: Likewise.
	* libgrust/libproc_macro/tokenstream.cc (TokenStream::make_tokenstream): Likewise.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
Add a callback from gcc to determine wether the bridge is available or
not.

gcc/rust/ChangeLog:

	* expand/rust-proc-macro.cc (available): Add symbol
	registration.
	(load_macros_array): Likewise.

ChangeLog:

	* libgrust/libproc_macro/proc_macro.cc (not_available): Add a
	function to express bridge unavailability.
	* libgrust/libproc_macro/proc_macro.h (not_available): Likewise.
	* libgrust/libproc_macro/registration.h: Add symbol type.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
Add is_available function to the C++ library.

ChangeLog:

	* libgrust/libproc_macro/proc_macro.cc (bridge_is_available):
	Add bridge function.
	* libgrust/libproc_macro/proc_macro.h (bridge_is_available):
	Likewise.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
There was no need to register a function when the value could be
registered directly.

gcc/rust/ChangeLog:

	* expand/rust-proc-macro.cc (available): Remove function.
	(load_macros_array): There was no need for an indirection here.

ChangeLog:

	* libgrust/libproc_macro/proc_macro.cc (not_available): Remove
	function.
	* libgrust/libproc_macro/proc_macro.h (not_available): Remove
	function prototype.
	* libgrust/libproc_macro/registration.h: Change symbol type.
	* libgrust/libproc_macro/bridge.h: New file.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
This function prototype was forgotten when the function was deleted.

ChangeLog:

	* libgrust/libproc_macro/proc_macro.h (proc_macro_register_from_str):
	Remove rogue function prototype.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
Initially a typedef was used to easily get the callback function pointer
type. Since this type has changed to a simpler well defined type, this
using declaration has no more purpose.

ChangeLog:

	* libgrust/libproc_macro/proc_macro.cc: Remove type alias.
	* libgrust/libproc_macro/registration.h: Likewise.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
ChangeLog:

	* .github/workflows/bootstrap.yml:
	Run a bootstrap build nightly.

Signed-off-by: Owen Avery <[email protected]>
gcc/rust/ChangeLog:

	* backend/rust-compile-base.h: Replace Location with location_t.
	* metadata/rust-imports.h: Likewise.
	* resolve/rust-name-resolver.cc: Likewise.
	* resolve/rust-name-resolver.h: Likewise.
	* rust-backend.h: Likewise.
	* rust-gcc.cc: Likewise.
	* rust-gcc.h: Likewise.

Signed-off-by: Owen Avery <[email protected]>
Check proc_macro, proc_macro_attribute and proc_macro_derive attributes
on non root functions, emit an error when one is found.

gcc/rust/ChangeLog:

	* util/rust-attributes.cc (check_proc_macro_non_root): Add
	function to emit this specific error.
	(AttributeChecker::visit): Modify visitor to propagate to some
	containers that were not handled correctly.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
Add multiple tests to prevent regressions on procedural macros errors
when one is declared outside of the crate's top level.

gcc/testsuite/ChangeLog:

	* rust/compile/proc_macro_attribute_non_root_function.rs: New test.
	* rust/compile/proc_macro_attribute_non_root_method.rs: New test.
	* rust/compile/proc_macro_attribute_non_root_module.rs: New test.
	* rust/compile/proc_macro_derive_non_root_function.rs: New test.
	* rust/compile/proc_macro_derive_non_root_method.rs: New test.
	* rust/compile/proc_macro_derive_non_root_module.rs: New test.
	* rust/compile/proc_macro_non_root_function.rs: New test.
	* rust/compile/proc_macro_non_root_method.rs: New test.
	* rust/compile/proc_macro_non_root_module.rs: New test.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
Updated ErrorCode struct to enum class to enforce proper
error codes, similiar to rustc. For converting the enum
to the respective error code, I used a map and updated
make_description & make_url function accordingly and
also removes the memory leak from the previous frame-
work. Also, added macro to safely convert the enum
number to string.

gcc/rust/ChangeLog:

	* backend/rust-compile-intrinsic.cc (Intrinsics::compile):
	Formatted according to enum class.
	* checks/errors/rust-feature-gate.cc (FeatureGate::gate): likewise.
	* checks/errors/rust-unsafe-checker.cc (check_unsafe_call): likewise.
	* hir/rust-ast-lower-base.cc (struct_field_name_exists): likewise.
	* resolve/rust-ast-resolve-expr.cc (ResolveExpr::visit): likewise.
	* resolve/rust-ast-resolve-path.cc (ResolvePath::resolve_path):
	likewise.
	* resolve/rust-ast-resolve-pattern.cc (PatternDeclaration::go): likewise.
	(PatternDeclaration::add_new_binding): likewise.
	* resolve/rust-ast-resolve-type.cc (ResolveRelativeTypePath::go): likewise.
	* resolve/rust-ast-verify-assignee.h: likewise.
	* rust-diagnostics.cc: updated make_desc & url function for enum class.
	* rust-diagnostics.h (struct ErrorCode): removed struct to switch to enum.
	(enum class): Switched from errorcode struct to enum class.
	(XSTR): Macro for converting enum to string.
	(STR): macro Used by XSTR for converting to string.
	(ERROR_CODE): macro used by map for check.
	(TABLE_TO_MAP): macro used by map for check
	* typecheck/rust-casts.cc (TypeCastRules::emit_cast_error):
	Formatted according to enum class.
	* typecheck/rust-hir-path-probe.h: likewise.
	* typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit): likewise.
	* typecheck/rust-hir-type-check-implitem.cc (TypeCheckTopLevelExternItem::visit):
	likewise.
	(TypeCheckImplItemWithTrait::visit): likewise.
	* typecheck/rust-hir-type-check-item.cc: likewise.
	* typecheck/rust-hir-type-check-pattern.cc (TypeCheckPattern::visit): likewise.
	(emit_invalid_field_error): likewise.
	* typecheck/rust-hir-type-check-struct.cc (TypeCheckStructExpr::resolve): likewise.
	* typecheck/rust-tyty-call.cc (emit_unexpected_argument_error): likewise.
	(TypeCheckCallExpr::visit): likewise.
	* typecheck/rust-tyty-subst.cc (SubstitutionRef::get_mappings_from_generic_args):
	likewise.
	* typecheck/rust-tyty.cc (BaseType::bounds_compatible): likewise.

Signed-off-by: Muhammad Mahad <[email protected]>
Move the function registered as a callback in a new anonymous namespace
in order to group every callback in the future under the same namespace.

gcc/rust/ChangeLog:

	* expand/rust-proc-macro.cc: Remove static modifier and move to
	an anonymous namespace.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
The literal conversion code could be used for the literal_from_string
callback, this means we should move it out of the function in it's own
function. This involves a new switch, which is quite sad but we're not
yet at a performance profiling phase, there may be lower hanging fruits.

gcc/rust/ChangeLog:

	* util/rust-token-converter.cc (handle_suffix): Rework function
	to make it work with the new literal conversion function.
	(convert_literal): Add a new function to convert to a proc macro
	literal from a literal tokenptr. The function will abort if the
	pointer does not point to a literal.
	(convert): Add call to convert literal for every literal case.
	* util/rust-token-converter.h (convert_literal): Add public
	prototype.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
The function to get a literal from a string missed an implementation.
It did require a conversion function to achieve it, now that callback
system has been merged this function can be easily implemented.

gcc/rust/ChangeLog:

	* expand/rust-proc-macro.cc (literal_from_string): Add callback
	function.
	(load_macros_array): Likewise.

ChangeLog:

	* libgrust/libproc_macro/literal.cc (Literal__from_string): Add
	implementation with call to constructor.
	(Literal::make_literal): Add new constructor which calls the
	callback.
	* libgrust/libproc_macro/literal.h: Add new constructor's
	prototype.
	* libgrust/libproc_macro/proc_macro.cc (bridge_is_available):
	Change symbol name to match convention.
	* libgrust/libproc_macro/registration.h: Add lit_from_str
	symbol.
	* libgrust/libproc_macro/tokenstream.cc (TokenStream::make_tokenstream):
	Change symbol name to disambiguate with literal from string.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
Refactored error message similiar to rustc
& called error function.

gcc/rust/ChangeLog:

	* typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit):
	refactored error message & called error function.

gcc/testsuite/ChangeLog:

	* rust/compile/break2.rs: Modified file to pass test case.
	* rust/compile/break_with_value_inside_loop.rs: New test.

Signed-off-by: Muhammad Mahad <[email protected]>
gcc/rust/ChangeLog:

	* typecheck/rust-autoderef.cc: Replace Location with location_t.
	* typecheck/rust-coercion.cc: Likewise.
	* typecheck/rust-coercion.h: Likewise.
	* typecheck/rust-hir-path-probe.h: Likewise.
	* typecheck/rust-hir-trait-reference.cc: Likewise.
	* typecheck/rust-hir-trait-resolve.cc: Likewise.
	* typecheck/rust-hir-type-check-base.cc: Likewise.
	* typecheck/rust-hir-type-check-expr.cc: Likewise.
	* typecheck/rust-hir-type-check-expr.h: Likewise.
	* typecheck/rust-hir-type-check-implitem.cc: Likewise.
	* typecheck/rust-hir-type-check-item.cc: Likewise.
	* typecheck/rust-hir-type-check-path.cc: Likewise.
	* typecheck/rust-hir-type-check-pattern.cc: Likewise.
	* typecheck/rust-hir-type-check-stmt.cc: Likewise.
	* typecheck/rust-hir-type-check-struct.cc: Likewise.
	* typecheck/rust-hir-type-check-type.cc: Likewise.
	* typecheck/rust-hir-type-check-type.h: Likewise.
	* typecheck/rust-type-util.cc: Likewise.
	* typecheck/rust-type-util.h: Likewise.
	* typecheck/rust-tyty-bounds.cc: Likewise.
	* typecheck/rust-tyty-call.cc: Likewise.
	* typecheck/rust-tyty-call.h: Likewise.
	* typecheck/rust-tyty-cmp.h: Likewise.
	* typecheck/rust-tyty-subst.cc: Likewise.
	* typecheck/rust-tyty-subst.h: Likewise.
	* typecheck/rust-tyty.cc: Likewise.
gcc/rust/ChangeLog:

	* rust-location.h (typedef Location): Remove.

	* expand/rust-proc-macro.cc
	(register_callback): Replace Location constructor with UNDEF_LOCATION.

	* ast/rust-ast-collector.h: Replace Location with location_t.
	* checks/errors/privacy/rust-privacy-reporter.cc: Likewise.
	* checks/errors/privacy/rust-privacy-reporter.h: Likewise.
	* checks/errors/privacy/rust-pub-restricted-visitor.cc: Likewise.
	* checks/errors/privacy/rust-pub-restricted-visitor.h: Likewise.
	* checks/errors/rust-feature-gate.cc: Likewise.
	* checks/errors/rust-feature-gate.h: Likewise.
	* metadata/rust-imports.h: Likewise.
	* resolve/rust-ast-resolve-path.h: Likewise.
	* resolve/rust-name-resolver.h: Likewise.
	* rust-backend.h: Likewise.
	* rust-diagnostics.h: Likewise.
	* rust-gcc.cc: Likewise.
	* rust-linemap.h: Likewise.
	* util/rust-attributes.cc: Likewise.
	* util/rust-hir-map.cc: Likewise.
	* util/rust-hir-map.h: Likewise.
	* util/rust-token-converter.cc: Likewise.

Signed-off-by: Owen Avery <[email protected]>
gcc/rust/ChangeLog:

	* rust-diagnostics.cc: Rework `make_description` and `make_url` functions.
	* rust-diagnostics.h: Specify ErrorCode's underlying type,
	remove error_codes_strings table.
	* rust_error_codes.def: New file.
gcc/rust/ChangeLog:

	* Make-lang.in: Add rust-unicode.o
	* rust-lang.cc (run_rust_tests): Add test.
	* rust-system.h: Include <array>
	* util/make-rust-unicode.py: Generater of rust-unicode-data.h.
	* util/rust-unicode-data.h: Auto-generated file.
	* util/rust-unicode.cc: New file.
	* util/rust-unicode.h: New file.

Signed-off-by: Raiki Tamura <[email protected]>
P-E-P and others added 29 commits October 17, 2023 17:20
Add a new test to highlight fix for Rust-GCC#2648.

gcc/testsuite/ChangeLog:

	* rust/compile/parse_pub_unit_type.rs: New test.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
Add a comma as an expr delimiter, this will allow correct parsing of
match arm expressions.

gcc/rust/ChangeLog:

	* parse/rust-parse-impl.h (Parser::parse_expr): Add comma delimiter.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
This new test highlight the fix for issue Rust-GCC#2657.

gcc/testsuite/ChangeLog:

	* rust/compile/match_break.rs: New test.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
gcc/rust/ChangeLog:

	* ast/rust-ast.h
	(Pattern::get_pattern_node_id): Rename to...
	(Pattern::get_node_id): ...here.
	* ast/rust-macro.h
	(MacroInvocation::get_pattern_node_id): Rename to...
	(MacroInvocation::get_node_id): ...here.
	* ast/rust-path.h
	(PathInExpression::get_pattern_node_id): Remove.
	(QualifiedPathInExpression::get_pattern_node_id): Remove.
	* ast/rust-pattern.h
	(LiteralPattern::get_pattern_node_id): Remove.
	(IdentifierPattern::get_pattern_node_id): Remove.
	(WildcardPattern::get_pattern_node_id): Remove.
	(RestPattern::get_pattern_node_id): Rename to...
	(RestPattern::get_node_id): ...here.
	(RangePattern::get_pattern_node_id): Remove.
	(ReferencePattern::get_pattern_node_id): Remove.
	(StructPattern::get_pattern_node_id): Remove.
	(TupleStructPattern::get_pattern_node_id): Remove.
	(TuplePattern::get_pattern_node_id): Remove.
	(GroupedPattern::get_pattern_node_id): Remove.
	(SlicePattern::get_pattern_node_id): Remove.
	(AltPattern::get_pattern_node_id): Remove.
	* resolve/rust-early-name-resolver.cc
	(EarlyNameResolver::visit):
	Use get_node_id instead of get_pattern_node_id.

Signed-off-by: Owen Avery <[email protected]>
When a token was identified as bit left shift it slipped through the
parser and resulted in an error.

gcc/rust/ChangeLog:

	* parse/rust-parse-impl.h (Parser::parse_path_expr_segment): Accept
	left shift tokens in order to let generic parsing function split the
	token.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
New regression test to highlight behavior of Rust-GCC#2652.

gcc/testsuite/ChangeLog:

	* rust/compile/parse_generic_path_expr.rs: New test.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
The parser was too agressive and did reject any line beginning with
default even if this was a macro call.

gcc/rust/ChangeLog:

	* parse/rust-parse-impl.h (Parser::parse_item): Relax constraints
	around default identifier at item scope to accept "default" macros.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
This test highlight the fix required for Rust-GCC#2655.

gcc/testsuite/ChangeLog:

	* rust/compile/parse_item_default_macro.rs: New test.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
gcc/rust/ChangeLog:

	* hir/tree/rust-hir-path.h: Avoid copy in getter.
	* hir/tree/rust-hir-pattern.h: Avoid copy in getter.
	* hir/tree/rust-hir.h: Avoid copy in getter.

Signed-off-by: Jakub Dupak <[email protected]>
gcc/rust/ChangeLog:

	* hir/rust-ast-lower-pattern.cc (ASTLoweringPattern::visit): Implement for tuple pat.
	* resolve/rust-ast-resolve-pattern.cc (PatternDeclaration::visit): Implement for tupple pat.

gcc/testsuite/ChangeLog:

	* rust/compile/tupple_struct_pattern_tuple.rs: New test.

Signed-off-by: Jakub Dupak <[email protected]>
gcc/rust/ChangeLog:

	* hir/tree/rust-hir-expr.h: Add getter for name.

Signed-off-by: Jakub Dupak <[email protected]>
Unify with the name used in Expr to allow convenient template over
everything that has mappings.

gcc/rust/ChangeLog:

	* backend/rust-compile-base.cc: Rename method.
	* backend/rust-compile-expr.cc (sort_tuple_patterns): Rename method.
	* backend/rust-compile-pattern.cc (CompilePatternCaseLabelExpr::visit): Rename method.
	(CompilePatternBindings::visit): Rename method.
	(CompilePatternLet::visit): Rename method.
	* backend/rust-compile-stmt.cc (CompileStmt::visit): Rename method.
	* backend/rust-compile-var-decl.h: Rename method.
	* hir/rust-ast-lower-pattern.cc (ASTLoweringPattern::translate): Rename method.
	* hir/rust-hir-dump.cc (Dump::visit): Rename method.
	* hir/tree/rust-hir-path.h: Rename method.
	* hir/tree/rust-hir-pattern.h: Rename method.
	* hir/tree/rust-hir.h: Rename method.
	* typecheck/rust-hir-type-check-pattern.cc (TypeCheckPattern::Resolve): Rename method.
	(TypeCheckPattern::visit): Rename method.
	(ClosureParamInfer::visit): Rename method.
	* typecheck/rust-hir-type-check-stmt.cc (TypeCheckStmt::visit): Rename method.
	* util/rust-hir-map.cc (Mappings::insert_hir_pattern): Rename method.

Signed-off-by: Jakub Dupak <[email protected]>
Use more a consistent name.

gcc/rust/ChangeLog:

	* backend/rust-compile-expr.cc (CompileExpr::visit): Rename method.
	* checks/errors/privacy/rust-privacy-reporter.cc (PrivacyReporter::visit): Rename method.
	* checks/errors/rust-const-checker.cc (ConstChecker::visit): Rename method.
	* checks/errors/rust-unsafe-checker.cc (UnsafeChecker::visit): Rename method.
	* hir/rust-hir-dump.cc (Dump::visit): Rename method.
	* hir/tree/rust-hir-expr.h: Rename method.
	* typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit): Rename method.
	* typecheck/rust-tyty.h: Rename method.
gcc/rust/ChangeLog:

	* hir/tree/rust-hir-path.h: Avoid copy in getter.

Signed-off-by: Jakub Dupak <[email protected]>
gcc/rust/ChangeLog:

	* Make-lang.in: Build borrowck.
	* checks/errors/borrowck/rust-borrow-checker.cc: New file.
	* checks/errors/borrowck/rust-borrow-checker.h: New file.
	* checks/errors/borrowck/rust-function-collector.h: New file.

Signed-off-by: Jakub Dupak <[email protected]>
gcc/rust/ChangeLog:

	* checks/errors/borrowck/rust-borrow-checker.cc: Include to compile new code.
	* checks/errors/borrowck/rust-bir-place.h: New file.
	* checks/errors/borrowck/rust-bir-visitor.h: New file.
	* checks/errors/borrowck/rust-bir.h: New file.

Signed-off-by: Jakub Dupak <[email protected]>
gcc/rust/ChangeLog:

	* Make-lang.in: Compile BIR expr visitor.
	* checks/errors/borrowck/rust-borrow-checker.cc (BorrowChecker::go): Use BIR builder.
	* rust-session-manager.cc (Session::compile_crate): Run borrow checker.
	* checks/errors/borrowck/rust-bir-builder-expr-stmt.cc: New file.
	* checks/errors/borrowck/rust-bir-builder-expr-stmt.h: New file.
	* checks/errors/borrowck/rust-bir-builder-internal.h: New file.
	* checks/errors/borrowck/rust-bir-builder-lazyboolexpr.h: New file.
	* checks/errors/borrowck/rust-bir-builder-pattern.h: New file.
	* checks/errors/borrowck/rust-bir-builder-struct.h: New file.
	* checks/errors/borrowck/rust-bir-builder.h: New file.

Signed-off-by: Jakub Dupak <[email protected]>
gcc/rust/ChangeLog:

	* Make-lang.in: Build BIR dump.
	* checks/errors/borrowck/rust-borrow-checker.cc (mkdir_wrapped): Cross-platform mkdir.
	(dump_function_bir): Save dump to file.
	(BorrowChecker::go): Run dump during borrowck.
	* checks/errors/borrowck/rust-bir-dump.cc: New file.
	* checks/errors/borrowck/rust-bir-dump.h: New file.

Signed-off-by: Jakub Dupak <[email protected]>
gcc/rust/ChangeLog:

	* checks/errors/borrowck/rust-bir-dump.cc (Dump::go): Use new print.
	(print_comma_separated): Comma separation print.
	(Dump::visit): Use new print.

Signed-off-by: Jakub Dupak <[email protected]>
Add option to simplify cfg for better readability. Off by default.

gcc/rust/ChangeLog:

	* checks/errors/borrowck/rust-bir-dump.cc (simplify_cfg): Simplify cfg logic.
	(Dump::go): Run simplify cfg.
	* checks/errors/borrowck/rust-bir-dump.h: Option to simplify cfg.

Signed-off-by: Jakub Dupak <[email protected]>
gcc/rust/ChangeLog:

	* checks/errors/borrowck/rust-bir-dump.cc (Dump::go): Improve jumps dump.
	(Dump::visit): Improve jumps dump.
	* checks/errors/borrowck/rust-bir-dump.h (class Dump): Improve jumps dump.

Signed-off-by: Jakub Dupak <[email protected]>
gcc/rust/ChangeLog:

	* checks/errors/borrowck/rust-bir-dump.cc (get_place_name): Removed.
	(renumber_places): Renumber logic.
	(Dump::go): Renumber places.
	(Dump::visit): Use renumbered places.
	(Dump::visit_place): Use renumbered places.
	* checks/errors/borrowck/rust-bir-dump.h (class Dump): Use renumbered places.

Signed-off-by: Jakub Dupak <[email protected]>
gcc/rust/ChangeLog:

	* checks/errors/borrowck/rust-bir-builder-expr-stmt.cc (ExprStmtBuilder::visit): Push ctx.
	(ExprStmtBuilder::setup_loop): Common loop infractructure setup.
	* checks/errors/borrowck/rust-bir-builder-expr-stmt.h: Loop ctx.
	* checks/errors/borrowck/rust-bir-builder-internal.h (struct BuilderContext): Loop ctx.

Signed-off-by: Jakub Dupak <[email protected]>
gcc/rust/ChangeLog:

	* checks/errors/borrowck/rust-bir-builder-expr-stmt.cc (ExprStmtBuilder::visit): Push ctx.
	(ExprStmtBuilder::setup_loop): Common loop infractructure setup.
	* checks/errors/borrowck/rust-bir-builder-expr-stmt.h: Loop ctx.
	* checks/errors/borrowck/rust-bir-builder-internal.h (struct BuilderContext): Loop ctx.

Signed-off-by: Jakub Dupak <[email protected]>
gcc/rust/ChangeLog:

	* checks/errors/borrowck/rust-bir-builder-expr-stmt.cc (ExprStmtBuilder::visit): Continue.
	(ExprStmtBuilder::setup_loop): Continue.

Signed-off-by: Jakub Dupak <[email protected]>
gcc/rust/ChangeLog:

	* checks/errors/borrowck/bir-design-notes.md: New file.

Signed-off-by: Jakub Dupak <[email protected]>
@jdupak jdupak force-pushed the polonius-investigation branch from 2353bff to 88a09ab Compare October 18, 2023 21:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.