From 5edad8f4508a32126c774470b851a1a7af4c7daf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Fri, 24 Feb 2023 19:54:50 +0100 Subject: [PATCH] User-defined literal suffixes: Tests --- test/libsolidity/ASTJSON/literalSuffix.json | 263 ++++++++++++++++++ test/libsolidity/ASTJSON/literalSuffix.sol | 6 + .../ASTJSON/literalSuffix_parseOnly.json | 179 ++++++++++++ .../analysis/FunctionCallGraph.cpp | 43 +++ .../calling_function_returned_by_suffix.sol | 15 + .../literalSuffixes/checked_suffixes.sol | 18 ++ .../literalSuffixes/decimal_decomposition.sol | 40 +++ .../deprecated_denomination_as_suffix.sol | 10 + .../function_shadowing_suffix.sol | 33 +++ .../literalSuffixes/integer_decomposition.sol | 33 +++ .../literalSuffixes/intermediate.sol | 22 ++ .../literalSuffixes/keccak256_suffix.sol | 30 ++ .../operators_on_suffixed_booleans.sol | 26 ++ .../operators_on_suffixed_integers.sol | 26 ++ .../overloaded_suffix_in_abi_encode.sol | 17 ++ .../recursive_suffix_application.sol | 16 ++ .../suffix_in_abi_encode_arguments.sol | 31 +++ .../suffix_in_abi_encode_selector.sol | 9 + .../suffix_in_abi_encode_signature.sol | 9 + .../literalSuffixes/suffix_in_new.sol | 9 + .../suffix_making_pure_external_call.sol | 37 +++ .../suffix_making_view_external_call.sol | 41 +++ .../suffix_return_parameter_cleanup.sol | 29 ++ .../literalSuffixes/suffix_return_types.sol | 46 +++ .../suffix_vs_operator_precedence.sol | 32 +++ .../literalSuffixes/suffixed_address.sol | 16 ++ .../literalSuffixes/suffixed_boolean.sol | 16 ++ .../literalSuffixes/suffixed_bytes.sol | 31 +++ .../literalSuffixes/suffixed_integer.sol | 40 +++ .../suffixed_literal_in_ternary_operator.sol | 21 ++ ...as_arguments_and_in_control_structures.sol | 117 ++++++++ .../suffixed_multipart_string.sol | 33 +++ .../literalSuffixes/suffixed_string.sol | 26 ++ ...nchecked_counter_with_literal_suffixes.sol | 34 +++ .../literalSuffixes/unchecked_suffixes.sol | 20 ++ .../revert_in_literal_suffix.sol | 13 + .../revert_in_literal_suffix_qualified.sol | 17 ++ ...ttached_function_call_on_suffix_result.sol | 11 + .../invalid_address_member_on_suffix.sol | 7 + ...valid_attached_function_call_on_suffix.sol | 13 + .../invalid_denomination_suffix.sol | 7 + ...nvalid_fractional_suffix_no_whitespace.sol | 7 + .../invalid_hex_suffix_no_whitespace.sol | 7 + .../invalid_integer_suffix_integer_suffix.sol | 7 + ...ped_suffix_with_function_as_suggestion.sol | 7 + .../invalid_power_suffixed_no_whitespace.sol | 7 + .../invalid_selector_member_on_suffix.sol | 7 + .../invalid_string_suffix_in_call_options.sol | 13 + .../invalid_string_suffix_string.sol | 7 + .../invalid_suffix_before_literal.sol | 7 + .../invalid_suffix_denomination.sol | 7 + .../application/invalid_suffix_in_delete.sol | 9 + .../invalid_suffix_no_whitespace.sol | 7 + .../invalid_suffix_with_call_options.sol | 7 + .../invalid_suffix_with_call_parentheses.sol | 7 + .../invalid_suffixed_assembly_annotation.sol | 11 + .../invalid_suffixed_conversion.sol | 7 + .../invalid_suffixed_double_integer.sol | 7 + .../invalid_suffixed_enum_member.sol | 9 + .../application/invalid_suffixed_error.sol | 11 + .../application/invalid_suffixed_event.sol | 11 + ...valid_suffixed_literals_in_array_sizes.sol | 61 ++++ ...invalid_suffixed_literals_in_constants.sol | 22 ++ ...nvalid_suffixed_literals_in_immutables.sol | 5 + ...lid_suffixed_multipart_string_two_args.sol | 8 + .../application/invalid_suffixed_pragma.sol | 5 + ...uffixed_string_multipart_concatenation.sol | 7 + .../invalid_suffixed_struct_type.sol | 11 + .../application/invalid_suffixed_suffix.sol | 8 + .../invalid_suffixed_suffixed_integer.sol | 7 + .../application/invalid_suffixed_variable.sol | 8 + .../invalid_suffixed_yul_literal.sol | 11 + .../invalid_value_member_on_suffix.sol | 7 + .../member_access_to_suffix_result.sol | 10 + .../application/suffix_no_literal.sol | 7 + .../application/suffixed_multipart_string.sol | 76 +++++ .../parameters/exponent_in_range.sol | 21 ++ .../parameters/exponent_out_of_range.sol | 31 +++ .../parameters/fixed_point_parameters.sol | 10 + .../parameters/function_shadowing_suffix.sol | 12 + .../parameters/integer_in_range.sol | 26 ++ .../parameters/integer_out_of_range.sol | 24 ++ .../parameters/mantissa_in_range.sol | 40 +++ .../parameters/mantissa_out_of_range.sol | 54 ++++ .../parameters/multiple_return_parameters.sol | 22 ++ .../parameters/no_return_parameters.sol | 9 + .../parameters/one_udvt_parameter.sol | 5 + .../parameters/overloading.sol | 11 + .../overloading_address_vs_payable.sol | 9 + ...ween_suffix_and_function_allowed_calls.sol | 19 ++ ...n_suffix_and_function_disallowed_calls.sol | 13 + ...rloading_decimal_mantissa_out_of_range.sol | 8 + .../overloading_decimal_vs_decimal.sol | 19 ++ ...ding_decimal_vs_decimal_ambiguous_sign.sol | 8 + ...ding_decimal_vs_decimal_ambiguous_size.sol | 8 + .../overloading_imported_suffix.sol | 31 +++ .../overloading_integer_vs_decimal.sol | 10 + ...erloading_integer_vs_decimal_ambiguous.sol | 10 + .../overloading_integer_vs_integer.sol | 19 ++ ...ding_integer_vs_integer_ambiguous_sign.sol | 8 + ...ding_integer_vs_integer_ambiguous_size.sol | 8 + .../parameters/overloading_no_call.sol | 4 + .../parameters/overloading_on_suffix_only.sol | 4 + .../parameters/overloading_qualified.sol | 15 + .../overloading_string_vs_bytes.sol | 6 + .../overloading_string_vs_bytes_ambiguous.sol | 8 + .../overloading_with_attached_functions.sol | 14 + ..._with_unimplemented_contract_functions.sol | 10 + .../parameters/parameter_location.sol | 16 ++ ..._no_implicit_conversions_from_literals.sol | 29 ++ .../parameters/return_type_calldata.sol | 25 ++ .../parameters/return_type_memory.sol | 13 + .../parameters/return_type_storage.sol | 33 +++ .../parameters/signed_exponent.sol | 38 +++ .../parameters/too_few_parameters.sol | 11 + .../parameters/too_many_parameters.sol | 30 ++ .../parameters/two_udvt_parameters.sol | 6 + .../parameters/type_mismatch.sol | 106 +++++++ ..._abi_encode_multiple_return_parameters.sol | 20 ++ .../with_abi_encode_no_return_parameters.sol | 23 ++ .../parsing/invalid_suffix_error.sol | 3 + .../parsing/invalid_suffix_event.sol | 5 + .../invalid_suffix_function_in_contract.sol | 5 + .../invalid_suffix_function_in_interface.sol | 6 + .../invalid_suffix_function_in_library.sol | 5 + .../invalid_suffix_function_pointer.sol | 5 + ...function_with_repeated_suffix_modifier.sol | 9 + .../parsing/invalid_suffix_modifier.sol | 5 + .../invalid_suffix_on_state_variable.sol | 5 + .../suffix_function_modifier_location.sol | 2 + .../literalSuffixes/shadowed_suffix.sol | 22 ++ .../literalSuffixes/suffix_naming.sol | 27 ++ ...id_suffixed_address_as_address_payable.sol | 10 + .../invalid_suffixed_address_as_uint.sol | 7 + ...nvalid_suffixed_address_too_few_digits.sol | 7 + ...valid_suffixed_address_too_many_digits.sol | 7 + ...nvalid_suffixed_address_wrong_checksum.sol | 7 + .../invalid_suffixed_array_literal.sol | 7 + ...id_suffixed_decimal_mantissa_too_large.sol | 12 + .../invalid_suffixed_decimal_octal.sol | 7 + .../invalid_suffixed_integer_octal.sol | 7 + .../invalid_suffixed_integer_octal_zero.sol | 7 + .../invalid_suffixed_integer_too_large.sol | 9 + .../invalid_suffixed_negative_as_unsigned.sol | 31 +++ ...invalid_suffixed_parenthesized_literal.sol | 9 + .../invalid_suffixed_string_hex.sol | 7 + .../invalid_suffixed_tuple_literal.sol | 9 + .../suffixableLiterals/suffixed_address.sol | 11 + .../suffixableLiterals/suffixed_boolean.sol | 8 + .../suffixableLiterals/suffixed_bytes.sol | 12 + .../suffixableLiterals/suffixed_decimal.sol | 59 ++++ .../suffixableLiterals/suffixed_integer.sol | 80 ++++++ .../suffixed_negative_as_signed.sol | 24 ++ .../suffixableLiterals/suffixed_string.sol | 12 + .../imported_function_as_suffix.sol | 16 ++ .../invalid_address_send_as_suffix.sol | 7 + .../invalid_bound_free_function_as_suffix.sol | 10 + ...d_bound_free_suffix_function_as_suffix.sol | 10 + ...valid_bound_library_function_as_suffix.sol | 12 + .../invalid_builtin_as_suffix.sol | 16 ++ .../invalid_denomination_as_suffix.sol | 61 ++++ .../usableAsSuffix/invalid_enum_as_suffix.sol | 7 + .../invalid_error_as_suffix.sol | 8 + .../invalid_event_as_suffix.sol | 8 + .../invalid_explicit_conversion_as_suffix.sol | 7 + ...d_external_contract_function_as_suffix.sol | 7 + ...id_external_library_function_as_suffix.sol | 9 + .../invalid_free_function_as_suffix.sol | 7 + ...id_free_non_payable_function_as_suffix.sol | 7 + ..._non_payable_suffix_function_as_suffix.sol | 7 + ...nvalid_free_payable_function_as_suffix.sol | 8 + ...free_payable_suffix_function_as_suffix.sol | 8 + .../invalid_free_view_function_as_suffix.sol | 7 + ...id_free_view_suffix_function_as_suffix.sol | 7 + .../invalid_function_pointer_as_suffix.sol | 14 + .../invalid_getter_as_suffix.sol | 7 + ...d_internal_contract_function_as_suffix.sol | 15 + ...id_internal_library_function_as_suffix.sol | 9 + .../invalid_magic_variable_as_suffix.sol | 5 + .../invalid_mapping_as_suffix.sol | 6 + .../invalid_modifier_as_suffix.sol | 7 + .../invalid_module_as_suffix.sol | 9 + ...overloaded_contract_function_as_suffix.sol | 8 + ...lid_public_contract_function_as_suffix.sol | 7 + .../invalid_revert_as_suffix.sol | 7 + .../invalid_struct_as_suffix.sol | 9 + .../invalid_suffix_called_delete.sol | 7 + .../invalid_suffix_called_hex.sol | 7 + .../invalid_suffix_called_hex_ambiguous.sol | 7 + .../invalid_suffix_called_new.sol | 7 + .../invalid_suffix_called_unicode.sol | 7 + .../invalid_super_as_suffix.sol | 5 + .../usableAsSuffix/invalid_this_as_suffix.sol | 5 + .../usableAsSuffix/invalid_type_as_suffix.sol | 7 + .../invalid_virtual_function_as_suffix.sol | 11 + .../suffix_called_value_via_member_access.sol | 8 + .../suffix_function_shadowing_builtin.sol | 3 + .../unimplemented_function_as_suffix.sol | 7 + ...tor_with_literal_suffix_on_udvt_binary.sol | 8 + ...ator_with_literal_suffix_on_udvt_unary.sol | 8 + ...ator_with_literal_suffix_on_value_type.sol | 13 + 201 files changed, 3593 insertions(+) create mode 100644 test/libsolidity/ASTJSON/literalSuffix.json create mode 100644 test/libsolidity/ASTJSON/literalSuffix.sol create mode 100644 test/libsolidity/ASTJSON/literalSuffix_parseOnly.json create mode 100644 test/libsolidity/semanticTests/literalSuffixes/calling_function_returned_by_suffix.sol create mode 100644 test/libsolidity/semanticTests/literalSuffixes/checked_suffixes.sol create mode 100644 test/libsolidity/semanticTests/literalSuffixes/decimal_decomposition.sol create mode 100644 test/libsolidity/semanticTests/literalSuffixes/deprecated_denomination_as_suffix.sol create mode 100644 test/libsolidity/semanticTests/literalSuffixes/function_shadowing_suffix.sol create mode 100644 test/libsolidity/semanticTests/literalSuffixes/integer_decomposition.sol create mode 100644 test/libsolidity/semanticTests/literalSuffixes/intermediate.sol create mode 100644 test/libsolidity/semanticTests/literalSuffixes/keccak256_suffix.sol create mode 100644 test/libsolidity/semanticTests/literalSuffixes/operators_on_suffixed_booleans.sol create mode 100644 test/libsolidity/semanticTests/literalSuffixes/operators_on_suffixed_integers.sol create mode 100644 test/libsolidity/semanticTests/literalSuffixes/overloaded_suffix_in_abi_encode.sol create mode 100644 test/libsolidity/semanticTests/literalSuffixes/recursive_suffix_application.sol create mode 100644 test/libsolidity/semanticTests/literalSuffixes/suffix_in_abi_encode_arguments.sol create mode 100644 test/libsolidity/semanticTests/literalSuffixes/suffix_in_abi_encode_selector.sol create mode 100644 test/libsolidity/semanticTests/literalSuffixes/suffix_in_abi_encode_signature.sol create mode 100644 test/libsolidity/semanticTests/literalSuffixes/suffix_in_new.sol create mode 100644 test/libsolidity/semanticTests/literalSuffixes/suffix_making_pure_external_call.sol create mode 100644 test/libsolidity/semanticTests/literalSuffixes/suffix_making_view_external_call.sol create mode 100644 test/libsolidity/semanticTests/literalSuffixes/suffix_return_parameter_cleanup.sol create mode 100644 test/libsolidity/semanticTests/literalSuffixes/suffix_return_types.sol create mode 100644 test/libsolidity/semanticTests/literalSuffixes/suffix_vs_operator_precedence.sol create mode 100644 test/libsolidity/semanticTests/literalSuffixes/suffixed_address.sol create mode 100644 test/libsolidity/semanticTests/literalSuffixes/suffixed_boolean.sol create mode 100644 test/libsolidity/semanticTests/literalSuffixes/suffixed_bytes.sol create mode 100644 test/libsolidity/semanticTests/literalSuffixes/suffixed_integer.sol create mode 100644 test/libsolidity/semanticTests/literalSuffixes/suffixed_literal_in_ternary_operator.sol create mode 100644 test/libsolidity/semanticTests/literalSuffixes/suffixed_literals_as_arguments_and_in_control_structures.sol create mode 100644 test/libsolidity/semanticTests/literalSuffixes/suffixed_multipart_string.sol create mode 100644 test/libsolidity/semanticTests/literalSuffixes/suffixed_string.sol create mode 100644 test/libsolidity/semanticTests/literalSuffixes/unchecked_counter_with_literal_suffixes.sol create mode 100644 test/libsolidity/semanticTests/literalSuffixes/unchecked_suffixes.sol create mode 100644 test/libsolidity/syntaxTests/controlFlow/unreachableCode/revert_in_literal_suffix.sol create mode 100644 test/libsolidity/syntaxTests/controlFlow/unreachableCode/revert_in_literal_suffix_qualified.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/attached_function_call_on_suffix_result.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_address_member_on_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_attached_function_call_on_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_denomination_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_fractional_suffix_no_whitespace.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_hex_suffix_no_whitespace.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_integer_suffix_integer_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_mistyped_suffix_with_function_as_suggestion.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_power_suffixed_no_whitespace.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_selector_member_on_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_string_suffix_in_call_options.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_string_suffix_string.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffix_before_literal.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffix_denomination.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffix_in_delete.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffix_no_whitespace.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffix_with_call_options.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffix_with_call_parentheses.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_assembly_annotation.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_conversion.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_double_integer.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_enum_member.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_error.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_event.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_literals_in_array_sizes.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_literals_in_constants.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_literals_in_immutables.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_multipart_string_two_args.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_pragma.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_string_multipart_concatenation.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_struct_type.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_suffixed_integer.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_variable.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_yul_literal.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/invalid_value_member_on_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/member_access_to_suffix_result.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/suffix_no_literal.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/application/suffixed_multipart_string.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/exponent_in_range.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/exponent_out_of_range.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/fixed_point_parameters.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/function_shadowing_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/integer_in_range.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/integer_out_of_range.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/mantissa_in_range.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/mantissa_out_of_range.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/multiple_return_parameters.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/no_return_parameters.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/one_udvt_parameter.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_address_vs_payable.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_between_suffix_and_function_allowed_calls.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_between_suffix_and_function_disallowed_calls.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_decimal_mantissa_out_of_range.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_decimal_vs_decimal.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_decimal_vs_decimal_ambiguous_sign.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_decimal_vs_decimal_ambiguous_size.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_imported_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_integer_vs_decimal.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_integer_vs_decimal_ambiguous.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_integer_vs_integer.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_integer_vs_integer_ambiguous_sign.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_integer_vs_integer_ambiguous_size.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_no_call.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_on_suffix_only.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_qualified.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_string_vs_bytes.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_string_vs_bytes_ambiguous.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_with_attached_functions.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_with_unimplemented_contract_functions.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/parameter_location.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/parameter_types_with_no_implicit_conversions_from_literals.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/return_type_calldata.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/return_type_memory.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/return_type_storage.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/signed_exponent.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/too_few_parameters.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/too_many_parameters.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/two_udvt_parameters.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/type_mismatch.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/with_abi_encode_multiple_return_parameters.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parameters/with_abi_encode_no_return_parameters.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_error.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_event.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_function_in_contract.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_function_in_interface.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_function_in_library.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_function_pointer.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_function_with_repeated_suffix_modifier.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_modifier.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_on_state_variable.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/parsing/suffix_function_modifier_location.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/shadowed_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/suffix_naming.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_address_as_address_payable.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_address_as_uint.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_address_too_few_digits.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_address_too_many_digits.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_address_wrong_checksum.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_array_literal.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_decimal_mantissa_too_large.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_decimal_octal.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_integer_octal.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_integer_octal_zero.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_integer_too_large.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_negative_as_unsigned.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_parenthesized_literal.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_string_hex.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_tuple_literal.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/suffixed_address.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/suffixed_boolean.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/suffixed_bytes.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/suffixed_decimal.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/suffixed_integer.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/suffixed_negative_as_signed.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/suffixed_string.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/imported_function_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_address_send_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_bound_free_function_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_bound_free_suffix_function_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_bound_library_function_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_builtin_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_denomination_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_enum_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_error_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_event_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_explicit_conversion_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_external_contract_function_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_external_library_function_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_free_function_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_free_non_payable_function_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_free_non_payable_suffix_function_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_free_payable_function_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_free_payable_suffix_function_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_free_view_function_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_free_view_suffix_function_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_function_pointer_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_getter_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_internal_contract_function_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_internal_library_function_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_magic_variable_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_mapping_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_modifier_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_module_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_overloaded_contract_function_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_public_contract_function_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_revert_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_struct_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_suffix_called_delete.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_suffix_called_hex.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_suffix_called_hex_ambiguous.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_suffix_called_new.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_suffix_called_unicode.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_super_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_this_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_type_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_virtual_function_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/suffix_called_value_via_member_access.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/suffix_function_shadowing_builtin.sol create mode 100644 test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/unimplemented_function_as_suffix.sol create mode 100644 test/libsolidity/syntaxTests/operators/userDefined/implementing_operator_with_literal_suffix_on_udvt_binary.sol create mode 100644 test/libsolidity/syntaxTests/operators/userDefined/implementing_operator_with_literal_suffix_on_udvt_unary.sol create mode 100644 test/libsolidity/syntaxTests/operators/userDefined/implementing_operator_with_literal_suffix_on_value_type.sol diff --git a/test/libsolidity/ASTJSON/literalSuffix.json b/test/libsolidity/ASTJSON/literalSuffix.json new file mode 100644 index 000000000..e887472b8 --- /dev/null +++ b/test/libsolidity/ASTJSON/literalSuffix.json @@ -0,0 +1,263 @@ +{ + "absolutePath": "a", + "exportedSymbols": + { + "C": + [ + 16 + ], + "str": + [ + 10 + ] + }, + "id": 17, + "nodeType": "SourceUnit", + "nodes": + [ + { + "body": + { + "id": 9, + "nodeType": "Block", + "src": "63:2:1", + "statements": [] + }, + "id": 10, + "implemented": true, + "kind": "freeFunction", + "modifiers": [], + "name": "str", + "nameLocation": "9:3:1", + "nodeType": "FunctionDefinition", + "parameters": + { + "id": 5, + "nodeType": "ParameterList", + "parameters": + [ + { + "constant": false, + "id": 2, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 10, + "src": "13:6:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": + { + "id": 1, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "13:6:1", + "typeDescriptions": + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 10, + "src": "21:4:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": + { + "id": 3, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "21:4:1", + "typeDescriptions": + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "12:14:1" + }, + "returnParameters": + { + "id": 8, + "nodeType": "ParameterList", + "parameters": + [ + { + "constant": false, + "id": 7, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 10, + "src": "48:13:1", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": + { + "id": 6, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "48:6:1", + "typeDescriptions": + { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "src": "47:15:1" + }, + "scope": 17, + "src": "0:65:1", + "stateMutability": "pure", + "suffix": true, + "virtual": false, + "visibility": "internal" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "C", + "contractDependencies": [], + "contractKind": "contract", + "fullyImplemented": true, + "id": 16, + "linearizedBaseContracts": + [ + 16 + ], + "name": "C", + "nameLocation": "75:1:1", + "nodeType": "ContractDefinition", + "nodes": + [ + { + "constant": false, + "id": 15, + "mutability": "mutable", + "name": "s", + "nameLocation": "90:1:1", + "nodeType": "VariableDeclaration", + "scope": 16, + "src": "83:26:1", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": + { + "typeIdentifier": "t_string_storage", + "typeString": "string" + }, + "typeName": + { + "id": 11, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "83:6:1", + "typeDescriptions": + { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "value": + { + "arguments": + [ + { + "hexValue": "3132332e3334355f373839", + "id": 12, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "94:11:1", + "typeDescriptions": + { + "typeIdentifier": "t_rational_123345789_by_1000000", + "typeString": "rational_const 123345789 / 1000000" + }, + "value": "123.345_789" + } + ], + "expression": + { + "argumentTypes": + [ + { + "typeIdentifier": "t_rational_123345789_by_1000000", + "typeString": "rational_const 123345789 / 1000000" + } + ], + "id": 13, + "name": "str", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10, + "src": "106:3:1", + "typeDescriptions": + { + "typeIdentifier": "t_function_internal_pure$_t_uint32_$_t_uint256_$returns$_t_string_memory_ptr_$", + "typeString": "function (uint32,uint256) pure returns (string memory)" + } + }, + "id": 14, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isSuffixCall": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "94:15:1", + "tryCall": false, + "typeDescriptions": + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "visibility": "internal" + } + ], + "scope": 17, + "src": "66:46:1", + "usedErrors": [] + } + ], + "src": "0:113:1" +} diff --git a/test/libsolidity/ASTJSON/literalSuffix.sol b/test/libsolidity/ASTJSON/literalSuffix.sol new file mode 100644 index 000000000..6d64d6f05 --- /dev/null +++ b/test/libsolidity/ASTJSON/literalSuffix.sol @@ -0,0 +1,6 @@ +function str(uint32, uint) pure suffix returns (string memory) {} +contract C { + string s = 123.345_789 str; +} + +// ---- diff --git a/test/libsolidity/ASTJSON/literalSuffix_parseOnly.json b/test/libsolidity/ASTJSON/literalSuffix_parseOnly.json new file mode 100644 index 000000000..d55c54ec5 --- /dev/null +++ b/test/libsolidity/ASTJSON/literalSuffix_parseOnly.json @@ -0,0 +1,179 @@ +{ + "absolutePath": "a", + "id": 17, + "nodeType": "SourceUnit", + "nodes": + [ + { + "body": + { + "id": 9, + "nodeType": "Block", + "src": "63:2:1", + "statements": [] + }, + "id": 10, + "implemented": true, + "kind": "freeFunction", + "modifiers": [], + "name": "str", + "nameLocation": "9:3:1", + "nodeType": "FunctionDefinition", + "parameters": + { + "id": 5, + "nodeType": "ParameterList", + "parameters": + [ + { + "constant": false, + "id": 2, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "src": "13:6:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": {}, + "typeName": + { + "id": 1, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "13:6:1", + "typeDescriptions": {} + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "src": "21:4:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": {}, + "typeName": + { + "id": 3, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "21:4:1", + "typeDescriptions": {} + }, + "visibility": "internal" + } + ], + "src": "12:14:1" + }, + "returnParameters": + { + "id": 8, + "nodeType": "ParameterList", + "parameters": + [ + { + "constant": false, + "id": 7, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "src": "48:13:1", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": {}, + "typeName": + { + "id": 6, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "48:6:1", + "typeDescriptions": {} + }, + "visibility": "internal" + } + ], + "src": "47:15:1" + }, + "src": "0:65:1", + "stateMutability": "pure", + "suffix": true, + "virtual": false, + "visibility": "internal" + }, + { + "abstract": false, + "baseContracts": [], + "contractDependencies": [], + "contractKind": "contract", + "id": 16, + "name": "C", + "nameLocation": "75:1:1", + "nodeType": "ContractDefinition", + "nodes": + [ + { + "constant": false, + "id": 15, + "mutability": "mutable", + "name": "s", + "nameLocation": "90:1:1", + "nodeType": "VariableDeclaration", + "src": "83:26:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": {}, + "typeName": + { + "id": 11, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "83:6:1", + "typeDescriptions": {} + }, + "value": + { + "arguments": + [ + { + "hexValue": "3132332e3334355f373839", + "id": 12, + "kind": "number", + "nodeType": "Literal", + "src": "94:11:1", + "typeDescriptions": {}, + "value": "123.345_789" + } + ], + "expression": + { + "id": 13, + "name": "str", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "src": "106:3:1", + "typeDescriptions": {} + }, + "id": 14, + "isSuffixCall": true, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "94:15:1", + "tryCall": false, + "typeDescriptions": {} + }, + "visibility": "internal" + } + ], + "src": "66:46:1", + "usedErrors": [] + } + ], + "src": "0:113:1" +} diff --git a/test/libsolidity/analysis/FunctionCallGraph.cpp b/test/libsolidity/analysis/FunctionCallGraph.cpp index da17fc433..3c8dbeca9 100644 --- a/test/libsolidity/analysis/FunctionCallGraph.cpp +++ b/test/libsolidity/analysis/FunctionCallGraph.cpp @@ -967,6 +967,49 @@ BOOST_AUTO_TEST_CASE(modifiers) checkCallGraphExpectations(get<1>(graphs), expectedDeployedEdges, expectedCreatedContractsAfterDeployment); } +BOOST_AUTO_TEST_CASE(literal_suffixes) +{ + unique_ptr compilerStack = parseAndAnalyzeContracts(R"( + function free() pure {} + function intSuffix(uint) pure suffix returns (uint) { free(); return 1; } + function strSuffix(string memory) pure suffix returns (uint) {} + + contract C { + modifier m(uint) virtual { _; } + + constructor() m(1 intSuffix) { "a" strSuffix; } + function ext() external pure m("a" strSuffix) { 1 intSuffix; inr(); } + function inr() internal pure { 1 intSuffix; } + } + )"s); + tuple graphs = collectGraphs(*compilerStack); + + map expectedCreationEdges = { + {"C", { + {"Entry", "constructor of C"}, + {"constructor of C", "modifier C.m"}, + {"constructor of C", "function intSuffix(uint256)"}, + {"constructor of C", "function strSuffix(string)"}, + {"function intSuffix(uint256)", "function free()"}, + }}, + }; + + map expectedDeployedEdges = { + {"C", { + {"Entry", "function C.ext()"}, + {"function C.ext()", "modifier C.m"}, + {"function C.ext()", "function C.inr()"}, + {"function C.ext()", "function strSuffix(string)"}, + {"function C.ext()", "function intSuffix(uint256)"}, + {"function C.inr()", "function intSuffix(uint256)"}, + {"function intSuffix(uint256)", "function free()"}, + }}, + }; + + checkCallGraphExpectations(get<0>(graphs), expectedCreationEdges); + checkCallGraphExpectations(get<1>(graphs), expectedDeployedEdges); +} + BOOST_AUTO_TEST_CASE(events) { unique_ptr compilerStack = parseAndAnalyzeContracts(R"( diff --git a/test/libsolidity/semanticTests/literalSuffixes/calling_function_returned_by_suffix.sol b/test/libsolidity/semanticTests/literalSuffixes/calling_function_returned_by_suffix.sol new file mode 100644 index 000000000..0e9f5dfec --- /dev/null +++ b/test/libsolidity/semanticTests/literalSuffixes/calling_function_returned_by_suffix.sol @@ -0,0 +1,15 @@ +function f(uint x) pure returns (uint) { + return 21 * x; +} + +function suffix(uint) pure suffix returns (function(uint) returns (uint)) { + return f; +} + +contract C { + function test() public returns (uint) { + return (1 suffix)(2) + 1 suffix(1); + } +} +// ---- +// test() -> 63 diff --git a/test/libsolidity/semanticTests/literalSuffixes/checked_suffixes.sol b/test/libsolidity/semanticTests/literalSuffixes/checked_suffixes.sol new file mode 100644 index 000000000..1e965a748 --- /dev/null +++ b/test/libsolidity/semanticTests/literalSuffixes/checked_suffixes.sol @@ -0,0 +1,18 @@ +function checkedSuffix(uint8 x) pure suffix returns (uint8) { + return x + 10; +} + +contract C { + function testCheckedSuffix() public pure returns (uint8) { + return 250 checkedSuffix; + } + + function testCheckedSuffixInUncheckedBlock() public pure returns (uint8) { + unchecked { + return 250 checkedSuffix; + } + } +} +// ---- +// testCheckedSuffix() -> FAILURE, hex"4e487b71", 0x11 +// testCheckedSuffixInUncheckedBlock() -> FAILURE, hex"4e487b71", 0x11 diff --git a/test/libsolidity/semanticTests/literalSuffixes/decimal_decomposition.sol b/test/libsolidity/semanticTests/literalSuffixes/decimal_decomposition.sol new file mode 100644 index 000000000..66dfd91be --- /dev/null +++ b/test/libsolidity/semanticTests/literalSuffixes/decimal_decomposition.sol @@ -0,0 +1,40 @@ +pragma abicoder v2; + +struct Decimal { + uint mantissa; + uint exponent; +} + +function asDecimal(uint mantissa, uint exponent) pure suffix returns (Decimal memory) { + return Decimal(mantissa, exponent); +} + +contract C { + function zero() public pure returns (Decimal memory) { + return 0.0 asDecimal; + } + + function simple() public pure returns (Decimal memory, Decimal memory, Decimal memory, Decimal memory, Decimal memory) { + return ( + 1234567800.0 asDecimal, + 12345678.0 asDecimal, + 1234.5678 asDecimal, + 12.345678 asDecimal, + 0.12345678 asDecimal + ); + } + + function maxMantissa() public pure returns (Decimal memory) { + return 0.00115792089237316195423570985008687907853269984665640564039457584007913129639935e10 asDecimal; // (2**256 - 1) * 10**-(80 - 10) + } + + function maxUint8Exponent() public pure returns (Decimal memory) { + return 1e-256 asDecimal; + } +} + +// ---- +// zero() -> 0, 0 +// simple() -> 1234567800, 0, 12345678, 0, 12345678, 4, 12345678, 6, 12345678, 8 +// maxMantissa() -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, 70 +// maxUint8Exponent() -> 1, 256 diff --git a/test/libsolidity/semanticTests/literalSuffixes/deprecated_denomination_as_suffix.sol b/test/libsolidity/semanticTests/literalSuffixes/deprecated_denomination_as_suffix.sol new file mode 100644 index 000000000..edd7e323f --- /dev/null +++ b/test/libsolidity/semanticTests/literalSuffixes/deprecated_denomination_as_suffix.sol @@ -0,0 +1,10 @@ +function szabo(uint x) pure suffix returns (uint) { return 2 * x; } +function finney(uint x) pure suffix returns (uint) { return 4 * x; } + +contract C { + uint public s = 2 szabo; + uint public f = 2 finney; +} +// ---- +// s() -> 4 +// f() -> 8 diff --git a/test/libsolidity/semanticTests/literalSuffixes/function_shadowing_suffix.sol b/test/libsolidity/semanticTests/literalSuffixes/function_shadowing_suffix.sol new file mode 100644 index 000000000..a3c4cb3ff --- /dev/null +++ b/test/libsolidity/semanticTests/literalSuffixes/function_shadowing_suffix.sol @@ -0,0 +1,33 @@ +function suffix(uint) pure suffix returns (string memory) { + return "suffix"; +} + +library L { + function suffix(uint) private pure returns (string memory) { + return "library function"; + } + + function run() public pure returns (string memory) { + return suffix(1); + } +} + +contract C { + function suffix(uint) internal pure returns (string memory) { + return "contract function"; + } + + function run() public pure returns (string memory) { + return suffix(1); + } + + function runL() public pure returns (string memory) { + return L.run(); + } +} +// ==== +// EVMVersion: >=byzantium +// ---- +// library: L +// run() -> 0x20, 0x11, "contract function" +// runL() -> 0x20, 0x10, "library function" diff --git a/test/libsolidity/semanticTests/literalSuffixes/integer_decomposition.sol b/test/libsolidity/semanticTests/literalSuffixes/integer_decomposition.sol new file mode 100644 index 000000000..85ac86951 --- /dev/null +++ b/test/libsolidity/semanticTests/literalSuffixes/integer_decomposition.sol @@ -0,0 +1,33 @@ +pragma abicoder v2; + +struct Decimal { + uint mantissa; + uint exponent; +} + +function asDecimal(uint mantissa, uint exponent) pure suffix returns (Decimal memory) { + return Decimal(mantissa, exponent); +} + +contract C { + function zero() public pure returns (Decimal memory) { + return 0 asDecimal; + } + + function simple() public pure returns (Decimal memory, Decimal memory, Decimal memory) { + return ( + 1234567800 asDecimal, + 12345678 asDecimal, + 1 asDecimal + ); + } + + function maxMantissa() public pure returns (Decimal memory) { + return 115792089237316195423570985008687907853269984665640564039457584007913129639935 asDecimal; // 2**256 - 1) + } +} + +// ---- +// zero() -> 0, 0 +// simple() -> 1234567800, 0, 12345678, 0, 1, 0 +// maxMantissa() -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, 0 diff --git a/test/libsolidity/semanticTests/literalSuffixes/intermediate.sol b/test/libsolidity/semanticTests/literalSuffixes/intermediate.sol new file mode 100644 index 000000000..ad852d51f --- /dev/null +++ b/test/libsolidity/semanticTests/literalSuffixes/intermediate.sol @@ -0,0 +1,22 @@ +type Length is uint; + +function km(uint meters) pure suffix returns (Length) { + return Length.wrap(meters * 1000); +} + +struct Float { + uint mantissa; + uint exponent; +} + +function f(uint mantissa, uint exponent) pure suffix returns (Float memory) { + return Float(mantissa, exponent); +} + +contract C { + Length public length = 5000 km; + Float public factor = 1.23 f; +} +// ---- +// length() -> 5000000 +// factor() -> 0x7b, 2 diff --git a/test/libsolidity/semanticTests/literalSuffixes/keccak256_suffix.sol b/test/libsolidity/semanticTests/literalSuffixes/keccak256_suffix.sol new file mode 100644 index 000000000..5655d7246 --- /dev/null +++ b/test/libsolidity/semanticTests/literalSuffixes/keccak256_suffix.sol @@ -0,0 +1,30 @@ +==== Source: builtin.sol ==== +function builtinKeccak(bytes memory input) pure returns (bytes32) { + return keccak256(input); +} +==== Source: suffix.sol ==== +import {builtinKeccak} from "builtin.sol"; + +function keccak256(bytes memory input) pure suffix returns (bytes32) { + // NOTE: A call to keccak256() here would not call the built-in + // and would instead result in infinite recursion. + return builtinKeccak(input); +} + +contract C { + function testBuiltin() public pure returns (bytes32) { + return builtinKeccak("solidity"); + } + + function testSuffix() public pure returns (bytes32) { + return "solidity" keccak256; + } + + function testSuffixFunctionCall() public pure returns (bytes32) { + return keccak256("solidity"); + } +} +// ---- +// testBuiltin() -> 0xa477d97b122e6356d32a064f9ee824230d42d04c7d66d8e7d125a091a42b0b25 +// testSuffix() -> 0xa477d97b122e6356d32a064f9ee824230d42d04c7d66d8e7d125a091a42b0b25 +// testSuffixFunctionCall() -> 0xa477d97b122e6356d32a064f9ee824230d42d04c7d66d8e7d125a091a42b0b25 diff --git a/test/libsolidity/semanticTests/literalSuffixes/operators_on_suffixed_booleans.sol b/test/libsolidity/semanticTests/literalSuffixes/operators_on_suffixed_booleans.sol new file mode 100644 index 000000000..03865c012 --- /dev/null +++ b/test/libsolidity/semanticTests/literalSuffixes/operators_on_suffixed_booleans.sol @@ -0,0 +1,26 @@ +type Bool is bool; +using {bitor as |, bitand as &, bitnot as ~} for Bool global; + +function bitor(Bool x, Bool y) pure returns (Bool) { + return Bool.wrap(Bool.unwrap(x) || Bool.unwrap(y)); +} + +function bitand(Bool x, Bool y) pure returns (Bool) { + return Bool.wrap(Bool.unwrap(x) && Bool.unwrap(y)); +} + +function bitnot(Bool x) pure returns (Bool) { + return Bool.wrap(!Bool.unwrap(x)); +} + +function b(bool x) pure suffix returns (Bool) { + return Bool.wrap(x); +} + +contract C { + function test() public pure returns (Bool) { + return ~ ~ ~(false b | true b & ~false b) & true b; + } +} +// ---- +// test() -> false diff --git a/test/libsolidity/semanticTests/literalSuffixes/operators_on_suffixed_integers.sol b/test/libsolidity/semanticTests/literalSuffixes/operators_on_suffixed_integers.sol new file mode 100644 index 000000000..efe1ea765 --- /dev/null +++ b/test/libsolidity/semanticTests/literalSuffixes/operators_on_suffixed_integers.sol @@ -0,0 +1,26 @@ +type Int is int; +using {add as +, mul as *, unsub as -} for Int global; + +function add(Int a, Int b) pure returns (Int) { + return Int.wrap(Int.unwrap(a) + Int.unwrap(b)); +} + +function mul(Int a, Int b) pure returns (Int) { + return Int.wrap(Int.unwrap(a) * Int.unwrap(b)); +} + +function unsub(Int a) pure returns (Int) { + return Int.wrap(-Int.unwrap(a)); +} + +function i(int x) pure suffix returns (Int) { + return Int.wrap(x); +} + +contract C { + function test() public pure returns (Int) { + return - - -(4 i + 4 i * -3 i) * 2 i; + } +} +// ---- +// test() -> 16 diff --git a/test/libsolidity/semanticTests/literalSuffixes/overloaded_suffix_in_abi_encode.sol b/test/libsolidity/semanticTests/literalSuffixes/overloaded_suffix_in_abi_encode.sol new file mode 100644 index 000000000..d1713769d --- /dev/null +++ b/test/libsolidity/semanticTests/literalSuffixes/overloaded_suffix_in_abi_encode.sol @@ -0,0 +1,17 @@ +function suffix(uint x) pure suffix returns (uint) { return x; } +function suffix(bool x) pure suffix returns (bool) { return x; } +function suffix(address x) pure suffix returns (address) { return x; } +function suffix(string memory x) pure suffix returns (string memory) { return x; } + +contract C { + function run() public returns (bytes memory) { + return abi.encode( + 42 suffix, + true suffix, + 0x1234567890123456789012345678901234567890 suffix, + "a" suffix + ); + } +} +// ---- +// run() -> 0x20, 0xc0, 0x2a, 1, 0x1234567890123456789012345678901234567890, 0x80, 1, "a" diff --git a/test/libsolidity/semanticTests/literalSuffixes/recursive_suffix_application.sol b/test/libsolidity/semanticTests/literalSuffixes/recursive_suffix_application.sol new file mode 100644 index 000000000..3840dce59 --- /dev/null +++ b/test/libsolidity/semanticTests/literalSuffixes/recursive_suffix_application.sol @@ -0,0 +1,16 @@ +function double(uint x) pure suffix returns (uint) { + if (x == 0) + return 0; + if (x == 1) + return 0 double + 2; + else + return 1 double * x; +} + +contract C { + function test() public pure returns (uint) { + return 10 double; + } +} +// ---- +// test() -> 20 diff --git a/test/libsolidity/semanticTests/literalSuffixes/suffix_in_abi_encode_arguments.sol b/test/libsolidity/semanticTests/literalSuffixes/suffix_in_abi_encode_arguments.sol new file mode 100644 index 000000000..cd31e5dcd --- /dev/null +++ b/test/libsolidity/semanticTests/literalSuffixes/suffix_in_abi_encode_arguments.sol @@ -0,0 +1,31 @@ +function uintSuffix(uint x) pure suffix returns (uint) { return x; } + +contract C { + function g(uint) public {} + + function test() public pure returns (bytes memory) { + return abi.encode(1 uintSuffix); + } + + function testPacked() public pure returns (bytes memory) { + return abi.encodePacked(2 uintSuffix); + } + + function testWithSelector() public pure returns (bytes memory) { + return abi.encodeWithSelector(0x12345678, 3 uintSuffix); + } + + function testWithSignature() public pure returns (bytes memory) { + return abi.encodeWithSignature("f()", 4 uintSuffix); + } + + function testCall() public view returns (bytes memory) { + return abi.encodeCall(this.g, 5 uintSuffix); + } +} +// ---- +// test() -> 0x20, 0x20, 1 +// testPacked() -> 0x20, 0x20, 2 +// testWithSelector() -> 0x20, 0x24, 0x1234567800000000000000000000000000000000000000000000000000000000, 0x0000000300000000000000000000000000000000000000000000000000000000 +// testWithSignature() -> 0x20, 0x24, 0x26121ff000000000000000000000000000000000000000000000000000000000, 0x0000000400000000000000000000000000000000000000000000000000000000 +// testCall() -> 0x20, 0x24, 0xe420264a00000000000000000000000000000000000000000000000000000000, 0x0000000500000000000000000000000000000000000000000000000000000000 diff --git a/test/libsolidity/semanticTests/literalSuffixes/suffix_in_abi_encode_selector.sol b/test/libsolidity/semanticTests/literalSuffixes/suffix_in_abi_encode_selector.sol new file mode 100644 index 000000000..97edaf8fe --- /dev/null +++ b/test/libsolidity/semanticTests/literalSuffixes/suffix_in_abi_encode_selector.sol @@ -0,0 +1,9 @@ +function selectorSuffix(uint) pure suffix returns (bytes4) { return 0x12345678; } + +contract C { + function test() public pure returns (bytes memory) { + return abi.encodeWithSelector(1234 selectorSuffix); + } +} +// ---- +// test() -> 0x20, 4, 0x1234567800000000000000000000000000000000000000000000000000000000 diff --git a/test/libsolidity/semanticTests/literalSuffixes/suffix_in_abi_encode_signature.sol b/test/libsolidity/semanticTests/literalSuffixes/suffix_in_abi_encode_signature.sol new file mode 100644 index 000000000..139f12f37 --- /dev/null +++ b/test/libsolidity/semanticTests/literalSuffixes/suffix_in_abi_encode_signature.sol @@ -0,0 +1,9 @@ +function signatureSuffix(string memory) pure suffix returns (string memory) { return "f()"; } + +contract C { + function test() public pure returns (bytes memory) { + return abi.encodeWithSignature("abcd" signatureSuffix); + } +} +// ---- +// test() -> 0x20, 4, 0x26121ff000000000000000000000000000000000000000000000000000000000 diff --git a/test/libsolidity/semanticTests/literalSuffixes/suffix_in_new.sol b/test/libsolidity/semanticTests/literalSuffixes/suffix_in_new.sol new file mode 100644 index 000000000..f9f779023 --- /dev/null +++ b/test/libsolidity/semanticTests/literalSuffixes/suffix_in_new.sol @@ -0,0 +1,9 @@ +function twice(uint x) pure suffix returns (uint) { return x * 2; } + +contract C { + function run() public pure returns (uint[] memory) { + return new uint[](5 twice); + } +} +// ---- +// run() -> 0x20, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 diff --git a/test/libsolidity/semanticTests/literalSuffixes/suffix_making_pure_external_call.sol b/test/libsolidity/semanticTests/literalSuffixes/suffix_making_pure_external_call.sol new file mode 100644 index 000000000..4c9212cc1 --- /dev/null +++ b/test/libsolidity/semanticTests/literalSuffixes/suffix_making_pure_external_call.sol @@ -0,0 +1,37 @@ +function suffix(int32 x) pure suffix returns (int32) { + return loadNegator().negate(x); +} + +interface INegator { + function negate(int32) external pure returns (int32); +} + +contract Negator is INegator { + function negate(int32 x) external pure override returns (int32) { + return -x; + } +} + +function storeNegator(INegator negator) pure { + assembly { + // this test would also work without assembly if we could hard-code an address here. + mstore(0, negator) + } +} + +function loadNegator() pure returns (INegator negator) { + assembly { + negator := mload(0) + } +} + +contract C { + function testSuffix() public returns (int32) { + storeNegator(new Negator()); + + return 10 suffix; + } +} +// ---- +// testSuffix() -> -10 +// gas legacy: 131793 diff --git a/test/libsolidity/semanticTests/literalSuffixes/suffix_making_view_external_call.sol b/test/libsolidity/semanticTests/literalSuffixes/suffix_making_view_external_call.sol new file mode 100644 index 000000000..2d5082e32 --- /dev/null +++ b/test/libsolidity/semanticTests/literalSuffixes/suffix_making_view_external_call.sol @@ -0,0 +1,41 @@ +function suffix(int32 x) pure suffix returns (int32) { + return loadNegator().negate(x); +} + +interface INegatorPure { + function negate(int32) external pure returns (int32); +} + +interface INegatorView { + function negate(int32) external view returns (int32); +} + +contract Negator is INegatorView { + function negate(int32 x) external view override returns (int32) { + return -x; + } +} + +function storeNegator(INegatorView negator) pure { + assembly { + // this test would also work without assembly if we could hard-code an address here. + mstore(0, negator) + } +} + +function loadNegator() pure returns (INegatorPure negator) { + assembly { + negator := mload(0) + } +} + +contract C { + function testSuffix() public returns (int32) { + storeNegator(new Negator()); + + return 10 suffix; + } +} +// ---- +// testSuffix() -> -10 +// gas legacy: 131793 diff --git a/test/libsolidity/semanticTests/literalSuffixes/suffix_return_parameter_cleanup.sol b/test/libsolidity/semanticTests/literalSuffixes/suffix_return_parameter_cleanup.sol new file mode 100644 index 000000000..1e6798d9c --- /dev/null +++ b/test/libsolidity/semanticTests/literalSuffixes/suffix_return_parameter_cleanup.sol @@ -0,0 +1,29 @@ +function suffix(uint8) pure suffix returns (uint8 z) { + assembly { + // Return a value with dirty bytes outside of uint8 + z := 0xffff + } +} + +contract C { + function test() external pure returns (uint, uint) { + uint8 a; + + // The exact literal used does not matter + uint8 suffixResult = 1 suffix; + uint8 functionResult = suffix(1); + + // Get the whole slot, including bytes outside of uint8 + uint suffixResultFull; + uint functionResultFull; + assembly { + suffixResultFull := suffixResult + functionResultFull := functionResult + } + + // If the result is not 0xff, no cleanup was performed. + return (suffixResultFull, functionResultFull); + } +} +// ---- +// test() -> 0xffff, 0xffff diff --git a/test/libsolidity/semanticTests/literalSuffixes/suffix_return_types.sol b/test/libsolidity/semanticTests/literalSuffixes/suffix_return_types.sol new file mode 100644 index 000000000..64bf0027d --- /dev/null +++ b/test/libsolidity/semanticTests/literalSuffixes/suffix_return_types.sol @@ -0,0 +1,46 @@ +struct S { uint x; } +enum E {A, B, C} +type T is uint72; +interface I { + function f(uint) external pure returns (T); +} + +function uintSuffix(uint) pure suffix returns (uint) { return 1234; } +function bytes4Suffix(uint) pure suffix returns (bytes4) { return 0x12345678; } +function addressSuffix(uint) pure suffix returns (address) { return 0x1111111111222222222233333333334444444444; } +function stringSuffix(uint) pure suffix returns (string memory) { return "abcd"; } +function bytesSuffix(uint) pure suffix returns (bytes memory) { return "abcd"; } +function arraySuffix(uint) pure suffix returns (bytes3[3] memory) { return [bytes3(0x123456), 0x123456, 0x123456]; } +function structSuffix(uint) pure suffix returns (S memory) { return S(42); } +function enumSuffix(uint) pure suffix returns (E) { return E.C; } +function udvtSuffix(uint) pure suffix returns (T) { return T.wrap(42); } +function interfaceSuffix(uint) pure suffix returns (I) { return I(address(42)); } +function functionSuffix(uint) pure suffix returns (function (uint) external pure returns (T)) { return I(address(0x1111111111222222222233333333334444444444)).f; } + +contract C { + uint public a = 1 uintSuffix; + bytes4 public b = 1 bytes4Suffix; + address public c = 1 addressSuffix; + string public d = 1 stringSuffix; + bytes public e = 1 bytesSuffix; + bytes3[3] public f = 1 arraySuffix; + S public g = 1 structSuffix; + E public h = 1 enumSuffix; + T public i = 1 udvtSuffix; + I public j = 1 interfaceSuffix; + function (uint) external pure returns (T) public k = 1 functionSuffix; +} +// ---- +// a() -> 1234 +// b() -> 0x1234567800000000000000000000000000000000000000000000000000000000 +// c() -> 0x1111111111222222222233333333334444444444 +// d() -> 0x20, 4, "abcd" +// e() -> 0x20, 4, "abcd" +// f(uint256): 0 -> 0x1234560000000000000000000000000000000000000000000000000000000000 +// f(uint256): 1 -> 0x1234560000000000000000000000000000000000000000000000000000000000 +// f(uint256): 2 -> 0x1234560000000000000000000000000000000000000000000000000000000000 +// g() -> 42 +// h() -> 2 +// i() -> 42 +// j() -> 42 +// k() -> 0x1111111111222222222233333333334444444444b3de648b0000000000000000 diff --git a/test/libsolidity/semanticTests/literalSuffixes/suffix_vs_operator_precedence.sol b/test/libsolidity/semanticTests/literalSuffixes/suffix_vs_operator_precedence.sol new file mode 100644 index 000000000..5fa4a9ec9 --- /dev/null +++ b/test/libsolidity/semanticTests/literalSuffixes/suffix_vs_operator_precedence.sol @@ -0,0 +1,32 @@ +type Int is int; +using {sub as -, unsub as -} for Int global; + +function sub(Int a, Int b) pure returns (Int) { + return Int.wrap((Int.unwrap(a) - Int.unwrap(b)) * 100); +} + +function unsub(Int a) pure returns (Int) { + return Int.wrap(Int.unwrap(a) + 10); +} + +function u(int x) pure suffix returns (Int) { + return Int.wrap(x + 1); +} + +contract C { + function testUnary() public pure returns (Int) { + return -2 u; + } + + function testUnaryWithParens() public pure returns (Int) { + return -(2 u); + } + + function testBinary() public pure returns (Int) { + return 4 u - 2 u; + } +} +// ---- +// testUnary() -> 13 +// testUnaryWithParens() -> 13 +// testBinary() -> 200 diff --git a/test/libsolidity/semanticTests/literalSuffixes/suffixed_address.sol b/test/libsolidity/semanticTests/literalSuffixes/suffixed_address.sol new file mode 100644 index 000000000..ae79dac33 --- /dev/null +++ b/test/libsolidity/semanticTests/literalSuffixes/suffixed_address.sol @@ -0,0 +1,16 @@ +function not(address a) pure suffix returns (bytes20) { + return ~bytes20(a); +} + +contract C { + function notMin() public pure returns (bytes20) { + return 0x0000000000000000000000000000000000000000 not; + } + + function notMax() public pure returns (bytes20) { + return 0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF not; + } +} +// ---- +// notMin() -> 0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000 +// notMax() -> 0x0000000000000000000000000000000000000000 diff --git a/test/libsolidity/semanticTests/literalSuffixes/suffixed_boolean.sol b/test/libsolidity/semanticTests/literalSuffixes/suffixed_boolean.sol new file mode 100644 index 000000000..702ab3d6a --- /dev/null +++ b/test/libsolidity/semanticTests/literalSuffixes/suffixed_boolean.sol @@ -0,0 +1,16 @@ +function not(bool a) pure suffix returns (bool) { + return !a; +} + +contract C { + function notTrue() public pure returns (bool) { + return true not; + } + + function notFalse() public pure returns (bool) { + return false not; + } +} +// ---- +// notTrue() -> false +// notFalse() -> true diff --git a/test/libsolidity/semanticTests/literalSuffixes/suffixed_bytes.sol b/test/libsolidity/semanticTests/literalSuffixes/suffixed_bytes.sol new file mode 100644 index 000000000..29c924214 --- /dev/null +++ b/test/libsolidity/semanticTests/literalSuffixes/suffixed_bytes.sol @@ -0,0 +1,31 @@ +function length(bytes memory value) pure suffix returns (uint) { + return value.length; +} + +contract C { + function empty() public pure returns (uint) { + return "" length; + } + + function short() public pure returns (uint) { + return 'abcd' length; + } + + function long() public pure returns (uint) { + return 'abcdefghijklmnop abcdefghijklmnop' length; + } + + function hex_() public pure returns (uint) { + return hex'0123456789abcdef' length; + } + + function unicode_() public pure returns (uint) { + return unicode"😃" length; + } +} +// ---- +// empty() -> 0 +// short() -> 4 +// long() -> 33 +// hex_() -> 8 +// unicode_() -> 4 diff --git a/test/libsolidity/semanticTests/literalSuffixes/suffixed_integer.sol b/test/libsolidity/semanticTests/literalSuffixes/suffixed_integer.sol new file mode 100644 index 000000000..8fd42ff92 --- /dev/null +++ b/test/libsolidity/semanticTests/literalSuffixes/suffixed_integer.sol @@ -0,0 +1,40 @@ +function half(int value) pure suffix returns (int) { return value / 2; } +function half128(uint128 value) pure suffix returns (uint128) { return value / 2; } +function half64s(int64 value) pure suffix returns (int64) { return value / 2; } + +contract C { + function zero() public pure returns (int) { + return 0 half + int128(0 half128) + 0 half64s; + } + + function two() public pure returns (int) { + return 2 half + int128(2 half128) + 2 half64s; + } + + function negative() public pure returns (int) { + return + -2 half + + -int128(2 half128) + + -2 half64s; + } + + function max() public pure returns (int) { + return + 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff half + + int128(0xffffffffffffffffffffffffffffffff half128) + + 0x7fffffffffffffff half64s; + } + + function withDecimals() public pure returns (int) { + return + 2.0 half + + int128(0.0004e5 half128) + + 80000e-2 half64s; + } +} +// ---- +// zero() -> 0 +// two() -> 3 +// negative() -> -3 +// max() -> 0x4000000000000000000000000000000080000000000000003ffffffffffffffd +// withDecimals() -> 421 diff --git a/test/libsolidity/semanticTests/literalSuffixes/suffixed_literal_in_ternary_operator.sol b/test/libsolidity/semanticTests/literalSuffixes/suffixed_literal_in_ternary_operator.sol new file mode 100644 index 000000000..ebd70b966 --- /dev/null +++ b/test/libsolidity/semanticTests/literalSuffixes/suffixed_literal_in_ternary_operator.sol @@ -0,0 +1,21 @@ +function suffix(uint x) pure suffix returns (bool) { + return x < 3; +} + +contract C { + bool public suffixed1 = 1 suffix ? 2 suffix : 3 suffix ? 4 suffix : 5 suffix; + bool public suffixed2 = 1 suffix ? 2 suffix : (3 suffix ? 4 suffix : 5 suffix); + bool public suffixed3 = (1 suffix ? 2 suffix : 3 suffix) ? 4 suffix : 5 suffix; + + bool public bare1 = true ? true : false ? false : false; + bool public bare2 = true ? true : (false ? false : false); + bool public bare3 = (true ? true : false) ? false : false; +} + +// ---- +// suffixed1() -> true +// suffixed2() -> true +// suffixed3() -> false +// bare1() -> true +// bare2() -> true +// bare3() -> false diff --git a/test/libsolidity/semanticTests/literalSuffixes/suffixed_literals_as_arguments_and_in_control_structures.sol b/test/libsolidity/semanticTests/literalSuffixes/suffixed_literals_as_arguments_and_in_control_structures.sol new file mode 100644 index 000000000..f2c678223 --- /dev/null +++ b/test/libsolidity/semanticTests/literalSuffixes/suffixed_literals_as_arguments_and_in_control_structures.sol @@ -0,0 +1,117 @@ +function str(uint) pure suffix returns (bytes memory) { + return "abc"; +} + +function len(bytes memory b) pure suffix returns (uint) { + return b.length; +} + +function hash(bytes memory input) pure suffix returns (bytes32) { + return keccak256(input); +} + +function iszero(uint x) pure suffix returns (bool) { + return x == 0; +} + +contract D { + event Event(bytes, uint); + error Err(bytes, uint); + + uint public counter = "" len; + + constructor(bytes memory) {} + + modifier m(bytes memory s) { + counter += s.length; + _; + } + + function f(bytes memory b) external payable returns (uint) { + return b.length; + } +} + +library L { + function add(uint a, uint b) internal pure returns (uint) { + return a + b; + } +} + +contract C is D(10 str) { + constructor() m(42 str) { + counter += 10; + } + + using L for *; + + function testModifier() m(88 str) m(99 str) external {} + + function testCallOptions() external returns (uint) { + return this.f{gas: gasleft() * 10 / "1234567890" len}(1234 str); + } + + function testNamedArgs() external returns (uint) { + return this.f({b: 12345 str}); + } + + function testEvent() external { + emit Event(12 str, "xyzw" len); + } + + function testError() external pure { + revert Err(12 str, "xyzw" len); + } + + function testMemoryAllocation() external pure returns (uint) { + return new uint[]("12345" len).length; + } + + function testNewContract() external returns (uint) { + return new D{salt: "123" hash}(100 str).f(1234567 str); + } + + function testAttachedCall() external pure returns (uint) { + return ("abc" len).add(3); + } + + function testCondition() external pure returns (uint) { + if (0 iszero) + return 1; + else + return 0; + } + + function testAssert() external pure { + assert(0 iszero); + } + + function testRequire() external pure { + require(0 iszero); + } + + function testTuple() external pure returns (bool, bool) { + return (0 iszero, 1 iszero); + } +} +// ==== +// EVMVersion: >=constantinople +// ---- +// counter() -> 13 +// testModifier() -> +// counter() -> 19 +// testCallOptions() -> 3 +// testNamedArgs() -> 3 +// testEvent() -> +// ~ emit Event(bytes,uint256): 0x40, 0x04, 0x03, "abc" +// testError() -> FAILURE, hex"83e31485", 0x40, 0x04, 0x03, "abc" +// testMemoryAllocation() -> 5 +// testNewContract() -> 3 +// gas irOptimized: 111878 +// gas legacy: 185340 +// gas legacyOptimized: 118889 +// testAttachedCall() -> 6 +// testCondition() -> 1 +// testAssert() -> +// testRequire() -> +// testTuple() -> 1, 0 diff --git a/test/libsolidity/semanticTests/literalSuffixes/suffixed_multipart_string.sol b/test/libsolidity/semanticTests/literalSuffixes/suffixed_multipart_string.sol new file mode 100644 index 000000000..988d01998 --- /dev/null +++ b/test/libsolidity/semanticTests/literalSuffixes/suffixed_multipart_string.sol @@ -0,0 +1,33 @@ +function stringSuffix(string memory s) pure suffix returns (string memory) { return s; } +function bytesSuffix(bytes memory b) pure suffix returns (bytes memory) { return b; } + +contract C { + string public emptyString = "" '' "" "" stringSuffix; + bytes public emptyHex = hex"" hex'' hex"" hex"" bytesSuffix; + string public emptyUnicode = unicode"" unicode'' unicode"" unicode"" stringSuffix; + + string public string1 = "abcd" "" stringSuffix; + string public string2 = "" "efgh" stringSuffix; + string public string3 = "abcd" "efgh" stringSuffix; + + bytes public hex1 = hex"9798" hex"" bytesSuffix; + bytes public hex2 = hex"" hex"99a0" bytesSuffix; + bytes public hex3 = hex"9798" hex"99a0" bytesSuffix; + + string public unicode1 = unicode"😃" unicode"" stringSuffix; + string public unicode2 = unicode"" unicode"😃" stringSuffix; + string public unicode3 = unicode"😃" unicode"😃" stringSuffix; +} +// ---- +// emptyString() -> 0x20, 0 +// emptyHex() -> 0x20, 0 +// emptyUnicode() -> 0x20, 0 +// string1() -> 0x20, 4, "abcd" +// string2() -> 0x20, 4, "efgh" +// string3() -> 0x20, 8, "abcdefgh" +// hex1() -> 0x20, 2, 0x9798000000000000000000000000000000000000000000000000000000000000 +// hex2() -> 0x20, 2, 0x99a0000000000000000000000000000000000000000000000000000000000000 +// hex3() -> 0x20, 4, 0x979899a000000000000000000000000000000000000000000000000000000000 +// unicode1() -> 0x20, 4, "\xf0\x9f\x98\x83" +// unicode2() -> 0x20, 4, "\xf0\x9f\x98\x83" +// unicode3() -> 0x20, 8, "\xf0\x9f\x98\x83\xf0\x9f\x98\x83" diff --git a/test/libsolidity/semanticTests/literalSuffixes/suffixed_string.sol b/test/libsolidity/semanticTests/literalSuffixes/suffixed_string.sol new file mode 100644 index 000000000..f5fa56177 --- /dev/null +++ b/test/libsolidity/semanticTests/literalSuffixes/suffixed_string.sol @@ -0,0 +1,26 @@ +function length(string memory value) pure suffix returns (uint) { + return bytes(value).length; +} + +contract C { + function empty() public pure returns (uint) { + return "" length; + } + + function short() public pure returns (uint) { + return 'abcd' length; + } + + function long() public pure returns (uint) { + return 'abcdefghijklmnop abcdefghijklmnop' length; + } + + function unicode_() public pure returns (uint) { + return unicode"😃" length; + } +} +// ---- +// empty() -> 0 +// short() -> 4 +// long() -> 33 +// unicode_() -> 4 diff --git a/test/libsolidity/semanticTests/literalSuffixes/unchecked_counter_with_literal_suffixes.sol b/test/libsolidity/semanticTests/literalSuffixes/unchecked_counter_with_literal_suffixes.sol new file mode 100644 index 000000000..e3806909a --- /dev/null +++ b/test/libsolidity/semanticTests/literalSuffixes/unchecked_counter_with_literal_suffixes.sol @@ -0,0 +1,34 @@ +type UncheckedCounter is uint; + +using { + add as +, + lt as < +} for UncheckedCounter global; + +function add(UncheckedCounter x, UncheckedCounter y) pure returns (UncheckedCounter) { + unchecked { + return UncheckedCounter.wrap(UncheckedCounter.unwrap(x) + UncheckedCounter.unwrap(y)); + } +} + +function lt(UncheckedCounter x, UncheckedCounter y) pure returns (bool) { + return UncheckedCounter.unwrap(x) < UncheckedCounter.unwrap(y); +} + +function cycles(uint c) pure suffix returns (UncheckedCounter) { + return UncheckedCounter.wrap(c); +} + +contract C { + uint public total = 0; + + function testCounter() public returns (uint) { + for (UncheckedCounter i = 20 cycles; i < 23 cycles; i = i + 1 cycles) + total += UncheckedCounter.unwrap(i); + + return total; + } +} +// ---- +// testCounter() -> 63 +// total() -> 63 diff --git a/test/libsolidity/semanticTests/literalSuffixes/unchecked_suffixes.sol b/test/libsolidity/semanticTests/literalSuffixes/unchecked_suffixes.sol new file mode 100644 index 000000000..949c68675 --- /dev/null +++ b/test/libsolidity/semanticTests/literalSuffixes/unchecked_suffixes.sol @@ -0,0 +1,20 @@ +function uncheckedSuffix(uint8 x) pure suffix returns (uint8) { + unchecked { + return x + 10; + } +} + +contract C { + function testUncheckedSuffix() public pure returns (uint8) { + return 250 uncheckedSuffix; + } + + function testUncheckedSuffixInUncheckedBlock() public pure returns (uint8) { + unchecked { + return 250 uncheckedSuffix; + } + } +} +// ---- +// testUncheckedSuffix() -> 4 +// testUncheckedSuffixInUncheckedBlock() -> 4 diff --git a/test/libsolidity/syntaxTests/controlFlow/unreachableCode/revert_in_literal_suffix.sol b/test/libsolidity/syntaxTests/controlFlow/unreachableCode/revert_in_literal_suffix.sol new file mode 100644 index 000000000..fdd7f3459 --- /dev/null +++ b/test/libsolidity/syntaxTests/controlFlow/unreachableCode/revert_in_literal_suffix.sol @@ -0,0 +1,13 @@ +function suffix(uint) pure suffix returns (uint) { + revert(); +} + +contract C { + function f() public pure { + 1 suffix; + uint a = 0; + a; + } +} +// ---- +// Warning 5740: (138-159): Unreachable code. diff --git a/test/libsolidity/syntaxTests/controlFlow/unreachableCode/revert_in_literal_suffix_qualified.sol b/test/libsolidity/syntaxTests/controlFlow/unreachableCode/revert_in_literal_suffix_qualified.sol new file mode 100644 index 000000000..e3e5a6fe4 --- /dev/null +++ b/test/libsolidity/syntaxTests/controlFlow/unreachableCode/revert_in_literal_suffix_qualified.sol @@ -0,0 +1,17 @@ +==== Source: A.sol ==== +function suffix(uint) pure suffix returns (uint) { + revert(); +} + +==== Source: B.sol ==== +import "A.sol" as A; + +contract C { + function f() public pure { + 1 A.suffix; + uint a = 0; + a; + } +} +// ---- +// Warning 5740: (B.sol:94-115): Unreachable code. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/attached_function_call_on_suffix_result.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/attached_function_call_on_suffix_result.sol new file mode 100644 index 000000000..063005456 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/attached_function_call_on_suffix_result.sol @@ -0,0 +1,11 @@ +function suffix(uint) pure suffix returns (uint) {} + +library L { + function add(uint, uint) internal pure returns (uint) {} +} + +contract C { + using L for *; + + uint x = (1000 suffix).add(1); +} diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_address_member_on_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_address_member_on_suffix.sol new file mode 100644 index 000000000..c351d17fa --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_address_member_on_suffix.sol @@ -0,0 +1,7 @@ +function suffix(uint) pure suffix returns (function () external) {} + +contract C { + address x = 1000 suffix.address; +} +// ---- +// ParserError 2314: (110-117): Expected identifier but got 'address' diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_attached_function_call_on_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_attached_function_call_on_suffix.sol new file mode 100644 index 000000000..2c8f616bd --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_attached_function_call_on_suffix.sol @@ -0,0 +1,13 @@ +function suffix(uint) pure suffix returns (uint) {} + +library L { + function add(uint, uint) internal pure returns (uint) {} +} + +contract C { + using L for *; + + uint x = 1000 suffix.add(1); +} +// ---- +// TypeError 9582: (180-190): Member "add" not found or not visible after argument-dependent lookup in function (uint256) pure returns (uint256). diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_denomination_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_denomination_suffix.sol new file mode 100644 index 000000000..3d5bc8737 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_denomination_suffix.sol @@ -0,0 +1,7 @@ +function suffix(uint) pure suffix returns (uint) { return 1; } + +contract C { + uint x = 2 ether suffix; +} +// ---- +// ParserError 2314: (98-104): Expected ';' but got identifier diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_fractional_suffix_no_whitespace.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_fractional_suffix_no_whitespace.sol new file mode 100644 index 000000000..2059f03d0 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_fractional_suffix_no_whitespace.sol @@ -0,0 +1,7 @@ +function suffix(uint x) pure suffix returns (uint) { return x; } + +contract C { + uint x = 1.618suffix; +} +// ---- +// ParserError 8936: (92-97): Identifier-start is not allowed at end of a number. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_hex_suffix_no_whitespace.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_hex_suffix_no_whitespace.sol new file mode 100644 index 000000000..8150e6be5 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_hex_suffix_no_whitespace.sol @@ -0,0 +1,7 @@ +function suffix(uint x) pure suffix returns (uint) { return x; } + +contract C { + uint x = 0x1000suffix; +} +// ---- +// ParserError 8936: (92-98): Identifier-start is not allowed at end of a number. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_integer_suffix_integer_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_integer_suffix_integer_suffix.sol new file mode 100644 index 000000000..f6af40898 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_integer_suffix_integer_suffix.sol @@ -0,0 +1,7 @@ +function suffix(uint value) pure suffix returns (uint) { return value; } + +contract C { + uint x = 1000 suffix 1000 suffix; +} +// ---- +// ParserError 2314: (112-116): Expected ';' but got 'Number' diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_mistyped_suffix_with_function_as_suggestion.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_mistyped_suffix_with_function_as_suggestion.sol new file mode 100644 index 000000000..b0c920056 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_mistyped_suffix_with_function_as_suggestion.sol @@ -0,0 +1,7 @@ +function suffix(uint) pure returns (uint) {} + +contract C { + uint x = 1 suffx; +} +// ---- +// DeclarationError 7576: (74-79): Undeclared identifier. Did you mean "suffix"? diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_power_suffixed_no_whitespace.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_power_suffixed_no_whitespace.sol new file mode 100644 index 000000000..cd028b2b9 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_power_suffixed_no_whitespace.sol @@ -0,0 +1,7 @@ +function suffix(uint x) pure suffix returns (uint) { return x; } + +contract C { + uint x = 1000.0e-5suffix; +} +// ---- +// ParserError 8936: (92-101): Identifier-start is not allowed at end of a number. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_selector_member_on_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_selector_member_on_suffix.sol new file mode 100644 index 000000000..31cbd0009 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_selector_member_on_suffix.sol @@ -0,0 +1,7 @@ +function suffix(uint) pure suffix returns (function () external) {} + +contract C { + bytes4 x = 1000 suffix.selector; +} +// ---- +// TypeError 9582: (102-117): Member "selector" not found or not visible after argument-dependent lookup in function (uint256) pure returns (function () external). diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_string_suffix_in_call_options.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_string_suffix_in_call_options.sol new file mode 100644 index 000000000..1709cb60b --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_string_suffix_in_call_options.sol @@ -0,0 +1,13 @@ +function suffix(uint) pure suffix returns (string memory) {} + +interface I { + function f() external payable; +} +contract C { + function f() public { + I(address(42)).f{value: 5 suffix, gas: 1 suffix}(); + } +} +// ---- +// TypeError 7407: (184-192): Type string memory is not implicitly convertible to expected type uint256. +// TypeError 7407: (199-207): Type string memory is not implicitly convertible to expected type uint256. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_string_suffix_string.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_string_suffix_string.sol new file mode 100644 index 000000000..b4fa65333 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_string_suffix_string.sol @@ -0,0 +1,7 @@ +function suffix(string memory s) pure suffix returns (string memory) { return s; } + +contract C { + uint x = "abcd" suffix "abcd"; +} +// ---- +// ParserError 2314: (124-130): Expected ';' but got 'StringLiteral' diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffix_before_literal.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffix_before_literal.sol new file mode 100644 index 000000000..ed6861a3c --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffix_before_literal.sol @@ -0,0 +1,7 @@ +function suffix(uint value) pure suffix returns (uint) { return value; } + +contract C { + uint x = suffix 1000; +} +// ---- +// ParserError 2314: (107-111): Expected ';' but got 'Number' diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffix_denomination.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffix_denomination.sol new file mode 100644 index 000000000..f2b625a7b --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffix_denomination.sol @@ -0,0 +1,7 @@ +function suffix(uint) pure suffix returns (uint) { return 1; } + +contract C { + uint x = 8 suffix gwei; +} +// ---- +// ParserError 2314: (99-103): Expected ';' but got 'gwei' diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffix_in_delete.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffix_in_delete.sol new file mode 100644 index 000000000..d511742f5 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffix_in_delete.sol @@ -0,0 +1,9 @@ +function suffix(string memory s) pure suffix returns (string memory) { return s; } + +contract C { + function f() public pure { + delete "abc" suffix; + } +} +// ---- +// TypeError 4247: (143-155): Expression has to be an lvalue. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffix_no_whitespace.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffix_no_whitespace.sol new file mode 100644 index 000000000..5e8283bee --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffix_no_whitespace.sol @@ -0,0 +1,7 @@ +function suffix(uint x) pure suffix returns (uint) { return x; } + +contract C { + uint x = 1000suffix; +} +// ---- +// ParserError 8936: (92-96): Identifier-start is not allowed at end of a number. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffix_with_call_options.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffix_with_call_options.sol new file mode 100644 index 000000000..4f8fca756 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffix_with_call_options.sol @@ -0,0 +1,7 @@ +function suffix(uint value) pure suffix returns (uint) { return value; } + +contract C { + uint x = 1000 suffix{gas: 1}; +} +// ---- +// TypeError 2622: (100-119): Expected callable expression before call options. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffix_with_call_parentheses.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffix_with_call_parentheses.sol new file mode 100644 index 000000000..843560e41 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffix_with_call_parentheses.sol @@ -0,0 +1,7 @@ +function suffix(uint value) pure suffix returns (uint) { return value; } + +contract C { + uint x = 1000 suffix(); +} +// ---- +// TypeError 5704: (100-113): Integer is not callable. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_assembly_annotation.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_assembly_annotation.sol new file mode 100644 index 000000000..a871a8247 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_assembly_annotation.sol @@ -0,0 +1,11 @@ +function suffix(uint x) pure suffix returns (uint) { return x; } + +contract C { + function f() pure public { + assembly ("memory-safe" suffix) { + pop(0) + } + } +} +// ---- +// ParserError 2314: (142-148): Expected ')' but got identifier diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_conversion.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_conversion.sol new file mode 100644 index 000000000..926e2d19e --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_conversion.sol @@ -0,0 +1,7 @@ +function suffix(uint value) pure suffix returns (uint) { return value; } + +contract C { + int x = int(1000) suffix; +} +// ---- +// ParserError 2314: (109-115): Expected ';' but got identifier diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_double_integer.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_double_integer.sol new file mode 100644 index 000000000..5b7cd1348 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_double_integer.sol @@ -0,0 +1,7 @@ +function suffix(uint a, uint b) pure suffix returns (uint) { return a + b; } + +contract C { + uint x = 1000 1 suffix; +} +// ---- +// ParserError 2314: (109-110): Expected ';' but got 'Number' diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_enum_member.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_enum_member.sol new file mode 100644 index 000000000..1c10000c3 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_enum_member.sol @@ -0,0 +1,9 @@ +enum E {A, B, C} + +function suffix(E) pure suffix returns (E) {} + +contract C { + E e = E.A suffix; +} +// ---- +// ParserError 2314: (92-98): Expected ';' but got identifier diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_error.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_error.sol new file mode 100644 index 000000000..6ac7205da --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_error.sol @@ -0,0 +1,11 @@ +function suffix(uint x) pure returns (uint) { return x; } + +contract C { + error E(); + + function f() public { + revert E suffix; + } +} +// ---- +// ParserError 2314: (131-137): Expected '(' but got identifier diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_event.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_event.sol new file mode 100644 index 000000000..0b9b4e405 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_event.sol @@ -0,0 +1,11 @@ +function suffix(uint x) pure suffix returns (uint) { return x; } + +contract C { + event E(); + + function f() public { + emit E suffix; + } +} +// ---- +// ParserError 2314: (136-142): Expected '(' but got identifier diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_literals_in_array_sizes.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_literals_in_array_sizes.sol new file mode 100644 index 000000000..693d6d205 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_literals_in_array_sizes.sol @@ -0,0 +1,61 @@ +==== Source: A.sol ==== +function uintSuffix(uint x) pure suffix returns (uint) {} +function int8Suffix(uint x) pure suffix returns (int8) {} +function addressSuffix(uint x) pure suffix returns (address) {} +function decimalSuffix(uint m, uint e) pure suffix returns (uint) {} +function stringSuffix(uint x) pure suffix returns (string memory) {} +function bytesSuffix(uint x) pure suffix returns (bytes memory) {} + +==== Source: B.sol ==== +import "A.sol" as A; +import "A.sol"; + +contract C { + uint[42 uintSuffix] a; + uint[42 int8Suffix] b; + uint[42 addressSuffix] c; + uint[42 decimalSuffix] d; + uint[42 stringSuffix] e; + uint[42 bytesSuffix] f; + + uint[42 A.uintSuffix] a; + uint[42 A.int8Suffix] b; + uint[42 A.addressSuffix] c; + uint[42 A.decimalSuffix] d; + uint[42 A.stringSuffix] e; + uint[42 A.bytesSuffix] f; +} + +contract D { + uint[uintSuffix(42)] a; + uint[int8Suffix(42)] b; + uint[addressSuffix(42)] c; + uint[decimalSuffix(42)] d; + uint[stringSuffix(42)] e; + uint[bytesSuffix(42)] f; +} +// ---- +// DeclarationError 2333: (B.sol:227-250): Identifier already declared. +// DeclarationError 2333: (B.sol:256-279): Identifier already declared. +// DeclarationError 2333: (B.sol:285-311): Identifier already declared. +// DeclarationError 2333: (B.sol:317-343): Identifier already declared. +// DeclarationError 2333: (B.sol:349-374): Identifier already declared. +// DeclarationError 2333: (B.sol:380-404): Identifier already declared. +// TypeError 5462: (B.sol:60-73): Invalid array length, expected integer literal or constant expression. A suffixed literal is not a constant expression unless the suffix is a subdenomination. +// TypeError 5462: (B.sol:87-100): Invalid array length, expected integer literal or constant expression. A suffixed literal is not a constant expression unless the suffix is a subdenomination. +// TypeError 5462: (B.sol:114-130): Invalid array length, expected integer literal or constant expression. A suffixed literal is not a constant expression unless the suffix is a subdenomination. +// TypeError 5462: (B.sol:144-160): Invalid array length, expected integer literal or constant expression. A suffixed literal is not a constant expression unless the suffix is a subdenomination. +// TypeError 5462: (B.sol:174-189): Invalid array length, expected integer literal or constant expression. A suffixed literal is not a constant expression unless the suffix is a subdenomination. +// TypeError 5462: (B.sol:203-217): Invalid array length, expected integer literal or constant expression. A suffixed literal is not a constant expression unless the suffix is a subdenomination. +// TypeError 5462: (B.sol:232-247): Invalid array length, expected integer literal or constant expression. A suffixed literal is not a constant expression unless the suffix is a subdenomination. +// TypeError 5462: (B.sol:261-276): Invalid array length, expected integer literal or constant expression. A suffixed literal is not a constant expression unless the suffix is a subdenomination. +// TypeError 5462: (B.sol:290-308): Invalid array length, expected integer literal or constant expression. A suffixed literal is not a constant expression unless the suffix is a subdenomination. +// TypeError 5462: (B.sol:322-340): Invalid array length, expected integer literal or constant expression. A suffixed literal is not a constant expression unless the suffix is a subdenomination. +// TypeError 5462: (B.sol:354-371): Invalid array length, expected integer literal or constant expression. A suffixed literal is not a constant expression unless the suffix is a subdenomination. +// TypeError 5462: (B.sol:385-401): Invalid array length, expected integer literal or constant expression. A suffixed literal is not a constant expression unless the suffix is a subdenomination. +// TypeError 5462: (B.sol:431-445): Invalid array length, expected integer literal or constant expression. +// TypeError 5462: (B.sol:459-473): Invalid array length, expected integer literal or constant expression. +// TypeError 5462: (B.sol:487-504): Invalid array length, expected integer literal or constant expression. +// TypeError 5462: (B.sol:518-535): Invalid array length, expected integer literal or constant expression. +// TypeError 5462: (B.sol:549-565): Invalid array length, expected integer literal or constant expression. +// TypeError 5462: (B.sol:579-594): Invalid array length, expected integer literal or constant expression. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_literals_in_constants.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_literals_in_constants.sol new file mode 100644 index 000000000..cf8a813c3 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_literals_in_constants.sol @@ -0,0 +1,22 @@ +function uintSuffix(uint x) pure suffix returns (uint) { return x; } +function int8Suffix(int8 x) pure suffix returns (int8) { return x; } +function addressSuffix(address x) pure suffix returns (address) { return x; } +function decimalSuffix(uint m, uint e) pure suffix returns (uint) { return m + e; } +function stringSuffix(string memory x) pure suffix returns (string memory) { return x; } +function bytesSuffix(bytes memory x) pure suffix returns (bytes memory) { return x; } + +contract C { + uint constant a = 1 uintSuffix; + int8 constant b = 1 int8Suffix; + address constant c = 0x1234567890123456789012345678901234567890 addressSuffix; + uint constant d = 1.1 decimalSuffix; + string constant e = "a" stringSuffix; + bytes constant f = hex"abcd" bytesSuffix; +} +// ---- +// TypeError 8349: (511-523): Initial value for constant variable has to be compile-time constant. +// TypeError 8349: (547-559): Initial value for constant variable has to be compile-time constant. +// TypeError 8349: (586-642): Initial value for constant variable has to be compile-time constant. +// TypeError 8349: (666-683): Initial value for constant variable has to be compile-time constant. +// TypeError 8349: (709-725): Initial value for constant variable has to be compile-time constant. +// TypeError 8349: (750-771): Initial value for constant variable has to be compile-time constant. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_literals_in_immutables.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_literals_in_immutables.sol new file mode 100644 index 000000000..ac298a027 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_literals_in_immutables.sol @@ -0,0 +1,5 @@ +function suffix(uint x) pure suffix returns (uint) { return x; } + +contract C { + uint immutable a = 1 suffix; +} diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_multipart_string_two_args.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_multipart_string_two_args.sol new file mode 100644 index 000000000..7e6706dd1 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_multipart_string_two_args.sol @@ -0,0 +1,8 @@ +function suffix(string memory s, string memory) pure suffix returns (string memory) { return s; } + +contract C { + string s = "abcd" "" suffix; +} +// ---- +// TypeError 1587: (15-47): Literal suffix function has invalid parameter types. The mantissa parameter must be an integer. The exponent parameter must be an unsigned integer. +// TypeError 2505: (137-143): Functions that take 2 arguments can only be used as literal suffixes for rational numbers. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_pragma.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_pragma.sol new file mode 100644 index 000000000..686112740 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_pragma.sol @@ -0,0 +1,5 @@ +function x(uint v) pure suffix returns (uint) { return v; } + +pragma solidity 1 x; +// ---- +// ParserError 5333: (61-81): Source file requires different compiler version (current compiler is .... diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_string_multipart_concatenation.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_string_multipart_concatenation.sol new file mode 100644 index 000000000..884bb5e5d --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_string_multipart_concatenation.sol @@ -0,0 +1,7 @@ +function suffix(string memory) pure suffix returns (string memory) {} + +contract C { + string s = "abcd" suffix "abcd" suffix; +} +// ---- +// ParserError 2314: (113-119): Expected ';' but got 'StringLiteral' diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_struct_type.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_struct_type.sol new file mode 100644 index 000000000..be8ee6f69 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_struct_type.sol @@ -0,0 +1,11 @@ +struct S { + uint x; +} + +function suffix(S memory) pure suffix returns (S memory) {} + +contract C { + uint x = (S suffix); +} +// ---- +// ParserError 2314: (116-122): Expected ',' but got identifier diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_suffix.sol new file mode 100644 index 000000000..8014389dc --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_suffix.sol @@ -0,0 +1,8 @@ +function suffix(uint value) pure suffix returns (uint) { return value; } +function metasuffix(function (uint) pure returns (uint) value) pure suffix returns (uint) { return value; } + +contract C { + uint x = suffix metasuffix; +} +// ---- +// ParserError 2314: (215-225): Expected ';' but got identifier diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_suffixed_integer.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_suffixed_integer.sol new file mode 100644 index 000000000..c54012755 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_suffixed_integer.sol @@ -0,0 +1,7 @@ +function suffix(uint value) pure suffix returns (uint) { return value; } + +contract C { + uint x = 1000 suffix suffix; +} +// ---- +// ParserError 2314: (112-118): Expected ';' but got identifier diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_variable.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_variable.sol new file mode 100644 index 000000000..e8d811bae --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_variable.sol @@ -0,0 +1,8 @@ +function suffix(uint x) pure suffix returns (uint) { return x; } + +contract C { + uint v = 42; + uint x = v suffix; +} +// ---- +// ParserError 2314: (111-117): Expected ';' but got identifier diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_yul_literal.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_yul_literal.sol new file mode 100644 index 000000000..0f928ac29 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_suffixed_yul_literal.sol @@ -0,0 +1,11 @@ +function suffix(uint x) pure suffix returns (uint) { return x; } + +contract C { + function f() pure public { + assembly { + pop(0 suffix) + } + } +} +// ---- +// ParserError 2314: (147-153): Expected ',' but got identifier diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_value_member_on_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_value_member_on_suffix.sol new file mode 100644 index 000000000..8873194ce --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/invalid_value_member_on_suffix.sol @@ -0,0 +1,7 @@ +function suffix(uint) pure suffix returns (uint) {} + +contract C { + uint x = 1000 suffix.value; +} +// ---- +// TypeError 8820: (84-96): Member "value" is only available for payable functions. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/member_access_to_suffix_result.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/member_access_to_suffix_result.sol new file mode 100644 index 000000000..b67c77c05 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/member_access_to_suffix_result.sol @@ -0,0 +1,10 @@ +function functionSuffix(uint) pure suffix returns (function () external) {} +function addressSuffix(uint) pure suffix returns (address payable) {} +function arraySuffix(uint) pure suffix returns (uint[] memory) {} + +contract C { + bytes4 a = (1000 functionSuffix).selector; + address b = (1000 functionSuffix).address; + uint c = (1000 arraySuffix).length; + bool d = (1000 addressSuffix).send(1); +} diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/suffix_no_literal.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/suffix_no_literal.sol new file mode 100644 index 000000000..37fce48c3 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/suffix_no_literal.sol @@ -0,0 +1,7 @@ +function suffix(uint x) pure suffix returns (uint) { return x; } + +contract C { + function f() public pure { + suffix; + } +} diff --git a/test/libsolidity/syntaxTests/literalSuffixes/application/suffixed_multipart_string.sol b/test/libsolidity/syntaxTests/literalSuffixes/application/suffixed_multipart_string.sol new file mode 100644 index 000000000..078361dc1 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/application/suffixed_multipart_string.sol @@ -0,0 +1,76 @@ +function stringSuffix(string memory) pure suffix returns (string memory) {} +function bytesSuffix(bytes memory) pure suffix returns (bytes memory) {} + +contract C { + function testString() public pure { + "" "" stringSuffix; + '' '' stringSuffix; + "" "" "" "" stringSuffix; + ""''""'' "" stringSuffix; + + "abcd" "" stringSuffix; + "" "efgh" stringSuffix; + "abcd" "efgh" stringSuffix; + "abcd""efgh" stringSuffix; + "abcd" "efgh"stringSuffix; + "abcd""efgh"stringSuffix; + + 'abcd' '' stringSuffix; + '' 'efgh' stringSuffix; + 'abcd' 'efgh' stringSuffix; + 'abcd''efgh' stringSuffix; + 'abcd' 'efgh'stringSuffix; + 'abcd''efgh'stringSuffix; + + "abcd" 'efgh' stringSuffix; + 'abcd' "efgh" stringSuffix; + } + + function testHex() public pure { + hex"" hex"" bytesSuffix; + hex'' hex'' bytesSuffix; + hex"" hex"" hex"" hex"" bytesSuffix; + hex""hex''hex""hex'' hex"" bytesSuffix; + + hex"1122" hex"" bytesSuffix; + hex"" hex"3344" bytesSuffix; + hex"1122" hex"3344" bytesSuffix; + hex"1122"hex"3344" bytesSuffix; + hex"1122" hex"3344"bytesSuffix; + hex"1122"hex"3344"bytesSuffix; + + hex'1122' hex'' bytesSuffix; + hex'' hex'3344' bytesSuffix; + hex'1122' hex'3344' bytesSuffix; + hex'1122'hex'3344' bytesSuffix; + hex'1122' hex'3344'bytesSuffix; + hex'1122'hex'3344'bytesSuffix; + + hex"1122" hex'3344' bytesSuffix; + hex'1122' hex"3344" bytesSuffix; + } + + function testUnicode() public pure { + unicode"" unicode"" stringSuffix; + unicode'' unicode'' stringSuffix; + unicode"" unicode"" unicode"" unicode"" stringSuffix; + unicode""unicode''unicode""unicode'' unicode"" stringSuffix; + + unicode"😃" unicode"" stringSuffix; + unicode"" unicode"😃" stringSuffix; + unicode"😃" unicode"😃" stringSuffix; + unicode"😃"unicode"😃" stringSuffix; + unicode"😃" unicode"😃"stringSuffix; + unicode"😃"unicode"😃"stringSuffix; + + unicode'😃' unicode'' stringSuffix; + unicode'' unicode'😃' stringSuffix; + unicode'😃' unicode'😃' stringSuffix; + unicode'😃'unicode'😃' stringSuffix; + unicode'😃' unicode'😃'stringSuffix; + unicode'😃'unicode'😃'stringSuffix; + + unicode"😃" unicode'😃' stringSuffix; + unicode'😃' unicode"😃" stringSuffix; + } +} diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/exponent_in_range.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/exponent_in_range.sol new file mode 100644 index 000000000..c0174650e --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/exponent_in_range.sol @@ -0,0 +1,21 @@ +function u8(uint m, uint8 e) pure suffix returns (uint) {} +function u16(uint m, uint16 e) pure suffix returns (uint) {} +function u256(uint m, uint e) pure suffix returns (uint) {} + +contract C { + function min() public pure { + // We never use positive exponents so here it's just 0 and the whole number goes into mantissa + 1.0e77 u8; + 1.0e77 u16; + 1.0e77 u256; + + 115792089237316195423570985008687907853269984665640564039457584007913129639935.0 u8; // 2**256 - 1 + 115792089237316195423570985008687907853269984665640564039457584007913129639935.0 u16; // 2**256 - 1 + 115792089237316195423570985008687907853269984665640564039457584007913129639935.0 u256; // 2**256 - 1 + } + + function max() public pure { + 1e-255 u8; + 1e-1233 u16; + } +} diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/exponent_out_of_range.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/exponent_out_of_range.sol new file mode 100644 index 000000000..e9189963e --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/exponent_out_of_range.sol @@ -0,0 +1,31 @@ +function mi8eu8(int8 m, uint8 e) pure suffix returns (uint) {} +function u8(uint m, uint8 e) pure suffix returns (uint) {} +function u16(uint m, uint16 e) pure suffix returns (uint) {} +function u256(uint m, uint e) pure suffix returns (uint) {} + +contract C { + function min() public pure { + // We never use positive exponents so here it's just 0 and the whole number goes into mantissa + 1.0e78 u8; + 1.0e78 u16; + 1.0e78 u256; + + 115792089237316195423570985008687907853269984665640564039457584007913129639936 u8; // 2**256 + 115792089237316195423570985008687907853269984665640564039457584007913129639936 u16; // 2**256 + 115792089237316195423570985008687907853269984665640564039457584007913129639936 u256; // 2**256 + } + + function max() public pure { + 1e-256 u8; + 128e-256 mi8eu8; + } +} +// ---- +// TypeError 8838: (401-407): This number cannot be decomposed into a mantissa and decimal exponent that fit the range of parameters of any possible suffix function. The mantissa is out of range of the largest supported integer type. +// TypeError 8838: (420-426): This number cannot be decomposed into a mantissa and decimal exponent that fit the range of parameters of any possible suffix function. The mantissa is out of range of the largest supported integer type. +// TypeError 8838: (440-446): This number cannot be decomposed into a mantissa and decimal exponent that fit the range of parameters of any possible suffix function. The mantissa is out of range of the largest supported integer type. +// TypeError 8838: (462-540): This number cannot be decomposed into a mantissa and decimal exponent that fit the range of parameters of any possible suffix function. The mantissa is out of range of the largest supported integer type. +// TypeError 8838: (565-643): This number cannot be decomposed into a mantissa and decimal exponent that fit the range of parameters of any possible suffix function. The mantissa is out of range of the largest supported integer type. +// TypeError 8838: (668-746): This number cannot be decomposed into a mantissa and decimal exponent that fit the range of parameters of any possible suffix function. The mantissa is out of range of the largest supported integer type. +// TypeError 8838: (811-817): This number cannot be decomposed into a mantissa and decimal exponent that fit the range of parameters of the suffix function. The exponent is out of range of type uint8. +// TypeError 8838: (830-838): This number cannot be decomposed into a mantissa and decimal exponent that fit the range of parameters of the suffix function. The mantissa is out of range of type int8. The exponent is out of range of type uint8. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/fixed_point_parameters.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/fixed_point_parameters.sol new file mode 100644 index 000000000..942bf481d --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/fixed_point_parameters.sol @@ -0,0 +1,10 @@ +function fixedSuffix(fixed) pure suffix returns (uint) {} +function ufixedSuffix(ufixed) pure suffix returns (uint) {} + +contract C { + uint u = 1.1 fixedSuffix; + uint uf = 1.1 ufixedSuffix; +} +// ---- +// TypeError 2699: (21-26): Parameters of fixed-point types are not allowed in literal suffix functions. To support fractional literals the suffix function must accept two integer arguments (mantissa and exponent) that such literals can be decomposed into. +// TypeError 2699: (80-86): Parameters of fixed-point types are not allowed in literal suffix functions. To support fractional literals the suffix function must accept two integer arguments (mantissa and exponent) that such literals can be decomposed into. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/function_shadowing_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/function_shadowing_suffix.sol new file mode 100644 index 000000000..181146e16 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/function_shadowing_suffix.sol @@ -0,0 +1,12 @@ +function suffix(uint) pure suffix returns (uint) {} + +contract C { + function suffix(uint) internal pure returns (uint) {} + + function run() public pure returns (uint) { + return 1 suffix; + } +} +// ---- +// Warning 2519: (70-123): This declaration shadows an existing declaration. +// TypeError 4438: (190-196): The literal suffix must be either a subdenomination or a file-level suffix function. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/integer_in_range.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/integer_in_range.sol new file mode 100644 index 000000000..24a023a81 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/integer_in_range.sol @@ -0,0 +1,26 @@ +function s8(int8 x) pure suffix returns (uint) {} +function u8(uint8 x) pure suffix returns (uint) {} +function s16(int16 x) pure suffix returns (uint) {} +function u16(uint16 x) pure suffix returns (uint) {} +function s256(int x) pure suffix returns (uint) {} +function u256(uint x) pure suffix returns (uint) {} + +contract C { + function min() public pure { + 0 s8; + 0 u8; + 0 s16; + 0 u16; + 0 s256; + 0 u256; + } + + function max() public pure { + 127 s8; + 255 u8; + 32767 s16; + 65535 u16; + 57896044618658097711785492504343953926634992332820282019728792003956564819967 s256; // 2**255 - 1 + 115792089237316195423570985008687907853269984665640564039457584007913129639935 u256; // 2**256 - 1 + } +} diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/integer_out_of_range.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/integer_out_of_range.sol new file mode 100644 index 000000000..381f7f9b3 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/integer_out_of_range.sol @@ -0,0 +1,24 @@ +function s8(int8 x) pure suffix returns (uint) {} +function u8(uint8 x) pure suffix returns (uint) {} +function s16(int16 x) pure suffix returns (uint) {} +function u16(uint16 x) pure suffix returns (uint) {} +function s256(int x) pure suffix returns (uint) {} +function u256(uint x) pure suffix returns (uint) {} + +contract C { + function max() public pure { + 128 s8; + 256 u8; + 32768 s16; + 65536 u16; + 57896044618658097711785492504343953926634992332820282019728792003956564819968 s256; // 2**255 + 115792089237316195423570985008687907853269984665640564039457584007913129639936 u256; // 2**256 + } +} +// ---- +// TypeError 8838: (364-367): The number is out of range of type int8 accepted by the suffix function. +// TypeError 8838: (380-383): The number is out of range of type uint8 accepted by the suffix function. +// TypeError 8838: (396-401): The number is out of range of type int16 accepted by the suffix function. +// TypeError 8838: (415-420): The number is out of range of type uint16 accepted by the suffix function. +// TypeError 8838: (434-511): The number is out of range of type int256 accepted by the suffix function. +// TypeError 8838: (536-614): The number is out of range of type uint256 accepted by the suffix function. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/mantissa_in_range.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/mantissa_in_range.sol new file mode 100644 index 000000000..76a221b36 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/mantissa_in_range.sol @@ -0,0 +1,40 @@ +function s8(int8 m, uint e) pure suffix returns (uint) {} +function u8(uint8 m, uint e) pure suffix returns (uint) {} +function s16(int16 m, uint e) pure suffix returns (uint) {} +function u16(uint16 m, uint e) pure suffix returns (uint) {} +function s256(int m, uint e) pure suffix returns (uint) {} +function u256(uint m, uint e) pure suffix returns (uint) {} + +contract C { + function min() public pure { + 0 s8; + 0 u8; + 0 s16; + 0 u16; + 0 s256; + 0 u256; + + 0.0 s8; + 0.0 u8; + 0.0 s16; + 0.0 u16; + 0.0 s256; + 0.0 u256; + } + + function max() public pure { + 127 s8; + 255 u8; + 32767 s16; + 65535 u16; + 57896044618658097711785492504343953926634992332820282019728792003956564819967 s256; // 2**255 - 1 + 115792089237316195423570985008687907853269984665640564039457584007913129639935 u256; // 2**256 - 1 + + 1.27 s8; + 2.55 u8; + 3.2767 s16; + 6.5535 u16; + 5.7896044618658097711785492504343953926634992332820282019728792003956564819967 s256; // (2**255 - 1) * 10**-76 + 1.15792089237316195423570985008687907853269984665640564039457584007913129639935 u256; // (2**256 - 1) * 10**-77 + } +} diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/mantissa_out_of_range.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/mantissa_out_of_range.sol new file mode 100644 index 000000000..6079b05f1 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/mantissa_out_of_range.sol @@ -0,0 +1,54 @@ +function mi8eu8(int8 m, uint8 e) pure suffix returns (uint) {} +function s8(int8 m, uint e) pure suffix returns (uint) {} +function u8(uint8 m, uint e) pure suffix returns (uint) {} +function s16(int16 m, uint e) pure suffix returns (uint) {} +function u16(uint16 m, uint e) pure suffix returns (uint) {} +function s256(int m, uint e) pure suffix returns (uint) {} +function u256(uint m, uint e) pure suffix returns (uint) {} + +contract C { + function max() public pure { + 128 s8; + 256 u8; + 32768 s16; + 65536 u16; + 57896044618658097711785492504343953926634992332820282019728792003956564819968 s256; // 2**255 + 115792089237316195423570985008687907853269984665640564039457584007913129639936 u256; // 2**256 + + 1.28 s8; + 2.56 u8; + 3.2768 s16; + 6.5536 u16; + 5.7896044618658097711785492504343953926634992332820282019728792003956564819968 s256; // 2**255 * 10**-76 + 1.15792089237316195423570985008687907853269984665640564039457584007913129639936 u256; // 2**256 * 10**-77 + + 128_000 s8; + 256_000 u8; + 32768_000 s16; + 65536_000 u16; + 57896044618658097711785492504343953926634992332820282019728792003956564819968_000 s256; // 2**255 * 10**3 + 115792089237316195423570985008687907853269984665640564039457584007913129639936_000 u256; // 2**256 * 10**3 + + 128e-256 mi8eu8; + } +} +// ---- +// TypeError 8838: (475-478): This number cannot be decomposed into a mantissa and decimal exponent that fit the range of parameters of the suffix function. The mantissa is out of range of type int8. +// TypeError 8838: (491-494): This number cannot be decomposed into a mantissa and decimal exponent that fit the range of parameters of the suffix function. The mantissa is out of range of type uint8. +// TypeError 8838: (507-512): This number cannot be decomposed into a mantissa and decimal exponent that fit the range of parameters of the suffix function. The mantissa is out of range of type int16. +// TypeError 8838: (526-531): This number cannot be decomposed into a mantissa and decimal exponent that fit the range of parameters of the suffix function. The mantissa is out of range of type uint16. +// TypeError 8838: (545-622): This number cannot be decomposed into a mantissa and decimal exponent that fit the range of parameters of the suffix function. The mantissa is out of range of type int256. +// TypeError 8838: (647-725): This number cannot be decomposed into a mantissa and decimal exponent that fit the range of parameters of any possible suffix function. The mantissa is out of range of the largest supported integer type. +// TypeError 8838: (751-755): This number cannot be decomposed into a mantissa and decimal exponent that fit the range of parameters of the suffix function. The mantissa is out of range of type int8. +// TypeError 8838: (768-772): This number cannot be decomposed into a mantissa and decimal exponent that fit the range of parameters of the suffix function. The mantissa is out of range of type uint8. +// TypeError 8838: (785-791): This number cannot be decomposed into a mantissa and decimal exponent that fit the range of parameters of the suffix function. The mantissa is out of range of type int16. +// TypeError 8838: (805-811): This number cannot be decomposed into a mantissa and decimal exponent that fit the range of parameters of the suffix function. The mantissa is out of range of type uint16. +// TypeError 8838: (825-903): This number cannot be decomposed into a mantissa and decimal exponent that fit the range of parameters of the suffix function. The mantissa is out of range of type int256. +// TypeError 8838: (938-1017): This number cannot be decomposed into a mantissa and decimal exponent that fit the range of parameters of any possible suffix function. The mantissa is out of range of the largest supported integer type. +// TypeError 8838: (1053-1060): This number cannot be decomposed into a mantissa and decimal exponent that fit the range of parameters of the suffix function. The mantissa is out of range of type int8. +// TypeError 8838: (1073-1080): This number cannot be decomposed into a mantissa and decimal exponent that fit the range of parameters of the suffix function. The mantissa is out of range of type uint8. +// TypeError 8838: (1093-1102): This number cannot be decomposed into a mantissa and decimal exponent that fit the range of parameters of the suffix function. The mantissa is out of range of type int16. +// TypeError 8838: (1116-1125): This number cannot be decomposed into a mantissa and decimal exponent that fit the range of parameters of the suffix function. The mantissa is out of range of type uint16. +// TypeError 8838: (1139-1220): This number cannot be decomposed into a mantissa and decimal exponent that fit the range of parameters of any possible suffix function. The mantissa is out of range of the largest supported integer type. +// TypeError 8838: (1253-1335): This number cannot be decomposed into a mantissa and decimal exponent that fit the range of parameters of any possible suffix function. The mantissa is out of range of the largest supported integer type. +// TypeError 8838: (1369-1377): This number cannot be decomposed into a mantissa and decimal exponent that fit the range of parameters of the suffix function. The mantissa is out of range of type int8. The exponent is out of range of type uint8. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/multiple_return_parameters.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/multiple_return_parameters.sol new file mode 100644 index 000000000..6b3c48309 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/multiple_return_parameters.sol @@ -0,0 +1,22 @@ +struct S { uint x; } + +function uintUintSuffix(uint) pure suffix returns (uint, uint) { + return (1, 2); +} + +function bytesStructContractSuffix(string memory s) pure suffix returns (bytes memory, S memory, C) { + return (bytes(s), S(42), C(address(0))); +} + +contract C { + function f() public pure returns (uint, uint) { + return 1 uintUintSuffix; + } + + function g() public pure returns (bytes memory, S memory, C) { + return "abcd" bytesStructContractSuffix; + } +} +// ---- +// TypeError 7848: (72-84): Literal suffix functions must return exactly one value. +// TypeError 7848: (181-208): Literal suffix functions must return exactly one value. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/no_return_parameters.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/no_return_parameters.sol new file mode 100644 index 000000000..0c6f607fe --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/no_return_parameters.sol @@ -0,0 +1,9 @@ +function nullSuffix(uint) pure suffix {} + +contract C { + function f() public pure { + return 1 nullSuffix; + } +} +// ---- +// TypeError 7848: (38-38): Literal suffix functions must return exactly one value. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/one_udvt_parameter.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/one_udvt_parameter.sol new file mode 100644 index 000000000..a03bd8320 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/one_udvt_parameter.sol @@ -0,0 +1,5 @@ +type B is bool; + +function suffix(B x) pure suffix returns (B) {} +// ---- +// TypeError 2998: (33-36): This literal suffix function is not usable as a suffix because no literal is implicitly convertible to its parameter type. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading.sol new file mode 100644 index 000000000..0eff69e36 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading.sol @@ -0,0 +1,11 @@ +function suffix(uint) pure suffix returns (int) {} +function suffix(bool) pure suffix returns (bool) {} +function suffix(address) pure suffix returns (address) {} +function suffix(string memory) pure suffix returns (string memory) {} + +contract C { + int a = 1 suffix; + bool b = true suffix; + address c = 0x1234567890123456789012345678901234567890 suffix; + string d = "a" suffix; +} diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_address_vs_payable.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_address_vs_payable.sol new file mode 100644 index 000000000..d87ceccd8 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_address_vs_payable.sol @@ -0,0 +1,9 @@ +function suffix(address) pure suffix returns (address) {} +function suffix(address payable) pure suffix returns (address payable) {} + +contract C { + address payable a = 0x1234567890123456789012345678901234567890 suffix; +} +// ---- +// TypeError 2998: (74-89): This literal suffix function is not usable as a suffix because no literal is implicitly convertible to its parameter type. +// TypeError 7407: (170-219): Type address is not implicitly convertible to expected type address payable. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_between_suffix_and_function_allowed_calls.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_between_suffix_and_function_allowed_calls.sol new file mode 100644 index 000000000..1dd32f9f3 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_between_suffix_and_function_allowed_calls.sol @@ -0,0 +1,19 @@ +function s(uint) pure suffix returns (uint) {} +function s(string memory) pure returns (string memory) {} + +function f(uint) pure returns (uint) {} +function f(string memory) pure suffix returns (string memory) {} + +contract C { + function run() public pure { + 1 s; + s(1); + //"a" s; // not allowed + s("a"); + + //1 f; // not allowed + f(1); + "a" f; + f("a"); + } +} diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_between_suffix_and_function_disallowed_calls.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_between_suffix_and_function_disallowed_calls.sol new file mode 100644 index 000000000..f3c0d63ed --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_between_suffix_and_function_disallowed_calls.sol @@ -0,0 +1,13 @@ +function s(uint) pure suffix returns (uint) {} +function s(string memory) pure returns (string memory) {} + +contract C { + function run() public pure { + 1 s; // OK + s(1); // OK + "a" s; // not allowed + s("a"); // OK + } +} +// ---- +// TypeError 9322: (208-209): No matching declaration found after argument-dependent lookup. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_decimal_mantissa_out_of_range.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_decimal_mantissa_out_of_range.sol new file mode 100644 index 000000000..593a63649 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_decimal_mantissa_out_of_range.sol @@ -0,0 +1,8 @@ +function uSuffix(uint8, uint) pure suffix returns (int8) {} +function uSuffix(uint16, uint) pure suffix returns (int16) {} + +contract C { + int32 a = 115792089237316195423570985008687907853269984665640564039457584007913129639936 uSuffix; // 2**256 +} +// ---- +// TypeError 9322: (229-236): No matching declaration found after argument-dependent lookup. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_decimal_vs_decimal.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_decimal_vs_decimal.sol new file mode 100644 index 000000000..769d0cef7 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_decimal_vs_decimal.sol @@ -0,0 +1,19 @@ +function uSuffix(uint8, uint) pure suffix returns (int8) {} +function uSuffix(uint16, uint) pure suffix returns (int16) {} + +function iSuffix(int8, uint) pure suffix returns (int24) {} +function iSuffix(int16, uint) pure suffix returns (int32) {} + +function iuSuffix(uint8, uint) pure suffix returns (int40) {} +function iuSuffix(int8, uint) pure suffix returns (int48) {} + +contract C { + int16 a = 1.024 uSuffix; + int32 b = 1.024 iSuffix; + + int16 c = -1.024 uSuffix; + int32 d = -1.024 iSuffix; + + int40 e = 2.55 iuSuffix; + int40 f = -2.55 iuSuffix; +} diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_decimal_vs_decimal_ambiguous_sign.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_decimal_vs_decimal_ambiguous_sign.sol new file mode 100644 index 000000000..2a690cef7 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_decimal_vs_decimal_ambiguous_sign.sol @@ -0,0 +1,8 @@ +function iuSuffix(uint8, uint) pure suffix returns (uint) {} +function iuSuffix(int8, uint) pure suffix returns (uint) {} + +contract C { + uint a = 1.27 iuSuffix; +} +// ---- +// TypeError 4487: (153-161): No unique declaration found after argument-dependent lookup. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_decimal_vs_decimal_ambiguous_size.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_decimal_vs_decimal_ambiguous_size.sol new file mode 100644 index 000000000..6151cf2c9 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_decimal_vs_decimal_ambiguous_size.sol @@ -0,0 +1,8 @@ +function uSuffix(uint8, uint) pure suffix returns (uint) {} +function uSuffix(uint16, uint) pure suffix returns (uint) {} + +contract C { + uint a = 1.27 uSuffix; +} +// ---- +// TypeError 4487: (153-160): No unique declaration found after argument-dependent lookup. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_imported_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_imported_suffix.sol new file mode 100644 index 000000000..afea8f875 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_imported_suffix.sol @@ -0,0 +1,31 @@ +==== Source: A.sol ==== +function s(uint, uint) pure suffix returns (uint) {} + +function f(uint, uint) pure returns (uint) {} + +==== Source: B.sol ==== +import "A.sol"; + +function s(string memory) pure returns (string memory) {} + +function f(string memory) pure suffix returns (string memory) {} + +contract C { + function run() public pure { + 1024 s; + "a" f; + } +} +==== Source: C.sol ==== +import {s, f} from "A.sol"; + +function s(string memory) pure returns (string memory) {} + +function f(string memory) pure suffix returns (string memory) {} + +contract D { + function run() public pure { + 1024 s; + "a" f; + } +} diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_integer_vs_decimal.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_integer_vs_decimal.sol new file mode 100644 index 000000000..717d57d31 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_integer_vs_decimal.sol @@ -0,0 +1,10 @@ +function suffix256(uint) pure suffix returns (uint) {} +function suffix256(uint, uint) pure suffix returns (int) {} + +function suffix8(uint) pure suffix returns (uint8) {} +function suffix8(uint8, uint) pure suffix returns (int8) {} + +contract C { + int a = 1.1 suffix256; + uint8 b = 1024 suffix8; +} diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_integer_vs_decimal_ambiguous.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_integer_vs_decimal_ambiguous.sol new file mode 100644 index 000000000..eaa874994 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_integer_vs_decimal_ambiguous.sol @@ -0,0 +1,10 @@ +function suffix(uint) pure suffix returns (int) {} +function suffix(uint, uint) pure suffix returns (int) {} + +contract C { + function f() public pure { + int a = 1 suffix; + } +} +// ---- +// TypeError 4487: (171-177): No unique declaration found after argument-dependent lookup. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_integer_vs_integer.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_integer_vs_integer.sol new file mode 100644 index 000000000..17c9957b2 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_integer_vs_integer.sol @@ -0,0 +1,19 @@ +function uSuffix(uint8) pure suffix returns (int8) {} +function uSuffix(uint16) pure suffix returns (int16) {} + +function iSuffix(int8) pure suffix returns (int24) {} +function iSuffix(int16) pure suffix returns (int32) {} + +function iuSuffix(uint8) pure suffix returns (int40) {} +function iuSuffix(int8) pure suffix returns (int48) {} + +contract C { + int16 a = 1024 uSuffix; + int32 b = 1024 iSuffix; + + int16 c = -1024 uSuffix; + int32 d = -1024 iSuffix; + + int40 e = 255 iuSuffix; + int40 f = -255 iuSuffix; +} diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_integer_vs_integer_ambiguous_sign.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_integer_vs_integer_ambiguous_sign.sol new file mode 100644 index 000000000..25d36da38 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_integer_vs_integer_ambiguous_sign.sol @@ -0,0 +1,8 @@ +function iuSuffix(uint8) pure suffix returns (int) {} +function iuSuffix(int8) pure suffix returns (int) {} + +contract C { + int a = 127 iuSuffix; +} +// ---- +// TypeError 4487: (137-145): No unique declaration found after argument-dependent lookup. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_integer_vs_integer_ambiguous_size.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_integer_vs_integer_ambiguous_size.sol new file mode 100644 index 000000000..59cd105e9 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_integer_vs_integer_ambiguous_size.sol @@ -0,0 +1,8 @@ +function uSuffix(uint8) pure suffix returns (int) {} +function uSuffix(uint16) pure suffix returns (int) {} + +contract C { + int a = 127 uSuffix; +} +// ---- +// TypeError 4487: (137-144): No unique declaration found after argument-dependent lookup. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_no_call.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_no_call.sol new file mode 100644 index 000000000..3f5827f5b --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_no_call.sol @@ -0,0 +1,4 @@ +function suffix(uint) pure suffix returns (int) {} +function suffix(bool) pure suffix returns (bool) {} +function suffix(address) pure suffix returns (address) {} +function suffix(string memory) pure suffix returns (string memory) {} diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_on_suffix_only.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_on_suffix_only.sol new file mode 100644 index 000000000..610d12449 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_on_suffix_only.sol @@ -0,0 +1,4 @@ +function s(uint) pure suffix returns (uint) {} +function s(uint) pure returns (uint) {} +// ---- +// DeclarationError 1686: (0-46): Function with same name and parameter types defined twice. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_qualified.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_qualified.sol new file mode 100644 index 000000000..d301d08b5 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_qualified.sol @@ -0,0 +1,15 @@ +==== Source: A.sol ==== +function suffix(int, uint) pure suffix returns (int) {} +function suffix(bool) pure suffix returns (bool) {} +function suffix(address) pure suffix returns (address) {} +function suffix(string memory) pure suffix returns (string memory) {} + +==== Source: B.sol ==== +import "A.sol" as A; + +contract C { + int a = 1 A.suffix; + bool b = true A.suffix; + address c = 0x1234567890123456789012345678901234567890 A.suffix; + string d = "a" A.suffix; +} diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_string_vs_bytes.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_string_vs_bytes.sol new file mode 100644 index 000000000..f9dc96f8e --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_string_vs_bytes.sol @@ -0,0 +1,6 @@ +function suffix(string memory) pure suffix returns (string memory) {} +function suffix(bytes memory) pure suffix returns (bytes memory) {} + +contract C { + bytes a = hex"abcd" suffix; +} diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_string_vs_bytes_ambiguous.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_string_vs_bytes_ambiguous.sol new file mode 100644 index 000000000..edff07964 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_string_vs_bytes_ambiguous.sol @@ -0,0 +1,8 @@ +function suffix(string memory) pure suffix returns (uint) {} +function suffix(bytes memory) pure suffix returns (uint) {} + +contract C { + uint a = "abcd" suffix; +} +// ---- +// TypeError 4487: (155-161): No unique declaration found after argument-dependent lookup. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_with_attached_functions.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_with_attached_functions.sol new file mode 100644 index 000000000..3069b9c50 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_with_attached_functions.sol @@ -0,0 +1,14 @@ +library L { + function suffix(uint8) internal pure returns (uint8) {} + function suffix(uint16) internal pure returns (bytes16) {} +} + +contract C { + using L for uint8; + + function f(uint8 x) public { + 1 x.suffix; + } +} +// ---- +// TypeError 9582: (218-226): Member "suffix" not found or not visible after argument-dependent lookup in uint8. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_with_unimplemented_contract_functions.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_with_unimplemented_contract_functions.sol new file mode 100644 index 000000000..99044b8fd --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/overloading_with_unimplemented_contract_functions.sol @@ -0,0 +1,10 @@ +abstract contract C { + function suffix(uint8) internal pure virtual returns (uint8); + function suffix(uint16) internal pure virtual returns (bytes16); + + function f() public { + 1 suffix; + } +} +// ---- +// TypeError 9322: (194-200): No matching declaration found after argument-dependent lookup. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/parameter_location.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/parameter_location.sol new file mode 100644 index 000000000..ce0f539de --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/parameter_location.sol @@ -0,0 +1,16 @@ +function calldataSuffix(string memory s) pure suffix returns (string memory) {} +function memorySuffix(string calldata s) pure suffix returns (string memory) {} +function storageSuffix(string storage s) pure suffix returns (string memory) {} + +contract C { + function f() public pure { + "a" calldataSuffix; + "a" memorySuffix; // OK + "a" storageSuffix; + } +} +// ---- +// TypeError 2998: (102-119): This literal suffix function is not usable as a suffix because no literal is implicitly convertible to its parameter type. +// TypeError 2998: (183-199): This literal suffix function is not usable as a suffix because no literal is implicitly convertible to its parameter type. +// TypeError 8838: (321-324): The literal cannot be converted to type string accepted by the suffix function. +// TypeError 8838: (353-356): The literal cannot be converted to type string accepted by the suffix function. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/parameter_types_with_no_implicit_conversions_from_literals.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/parameter_types_with_no_implicit_conversions_from_literals.sol new file mode 100644 index 000000000..501ed3495 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/parameter_types_with_no_implicit_conversions_from_literals.sol @@ -0,0 +1,29 @@ +type T is uint; +interface I {} +enum E { A, B, C } +struct S { uint x; } +contract C {} + +function payableSuffix(address payable) pure suffix returns (uint) {} +function internalFunctionSuffix(function () internal) pure suffix returns (uint) {} +function externalFunctionSuffix(function () external) pure suffix returns (uint) {} +function mappingSuffix(mapping(uint => uint) storage) pure suffix returns (uint) {} +function udvtSuffix(T) pure suffix returns (uint) {} +function enumSuffix(E) pure suffix returns (uint) {} +function structSuffix(S memory) pure suffix returns (uint) {} +function interfaceSuffix(I) pure suffix returns (uint) {} +function contractSuffix(C) pure suffix returns (uint) {} +function staticArraySuffix(uint[3] memory) pure suffix returns (uint) {} +function dynamicArraySuffix(uint[] memory) pure suffix returns (uint) {} +// ---- +// TypeError 2998: (109-124): This literal suffix function is not usable as a suffix because no literal is implicitly convertible to its parameter type. +// TypeError 2998: (188-209): This literal suffix function is not usable as a suffix because no literal is implicitly convertible to its parameter type. +// TypeError 2998: (272-293): This literal suffix function is not usable as a suffix because no literal is implicitly convertible to its parameter type. +// TypeError 2998: (347-376): This literal suffix function is not usable as a suffix because no literal is implicitly convertible to its parameter type. +// TypeError 2998: (428-429): This literal suffix function is not usable as a suffix because no literal is implicitly convertible to its parameter type. +// TypeError 2998: (481-482): This literal suffix function is not usable as a suffix because no literal is implicitly convertible to its parameter type. +// TypeError 2998: (536-544): This literal suffix function is not usable as a suffix because no literal is implicitly convertible to its parameter type. +// TypeError 2998: (601-602): This literal suffix function is not usable as a suffix because no literal is implicitly convertible to its parameter type. +// TypeError 2998: (658-659): This literal suffix function is not usable as a suffix because no literal is implicitly convertible to its parameter type. +// TypeError 2998: (718-732): This literal suffix function is not usable as a suffix because no literal is implicitly convertible to its parameter type. +// TypeError 2998: (792-805): This literal suffix function is not usable as a suffix because no literal is implicitly convertible to its parameter type. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/return_type_calldata.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/return_type_calldata.sol new file mode 100644 index 000000000..72ad78897 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/return_type_calldata.sol @@ -0,0 +1,25 @@ +struct S { + uint x; +} + +function structSuffix(uint x) pure suffix returns (S calldata s) { + assembly { + s := x + } +} + +function arraySuffix(uint x) pure suffix returns (uint[5] calldata a) { + assembly { + a := x + } +} + +contract C { + function f() public pure { + 1 structSuffix; + 1 arraySuffix; + } +} +// ---- +// TypeError 7251: (77-89): Literal suffix functions can only return value types and reference types stored in memory. +// TypeError 7251: (182-200): Literal suffix functions can only return value types and reference types stored in memory. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/return_type_memory.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/return_type_memory.sol new file mode 100644 index 000000000..f86ee5617 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/return_type_memory.sol @@ -0,0 +1,13 @@ +struct S { + uint x; +} + +function structSuffix(uint x) pure suffix returns (S memory s) {} +function arraySuffix(uint x) pure suffix returns (uint[5] memory a) {} + +contract C { + function f() public pure { + 1 structSuffix; + 1 arraySuffix; + } +} diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/return_type_storage.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/return_type_storage.sol new file mode 100644 index 000000000..e7834bb98 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/return_type_storage.sol @@ -0,0 +1,33 @@ +struct S { + uint x; +} + +function structSuffix(uint x) pure suffix returns (S storage s) { + assembly ("memory-safe") { + s.slot := x + } +} + +function arraySuffix(uint x) pure suffix returns (uint[5] storage a) { + assembly ("memory-safe") { + a.slot := x + } +} + +function mappingSuffix(uint x) pure suffix returns (mapping(uint => uint) storage m) { + assembly ("memory-safe") { + m.slot := x + } +} + +contract C { + function f() public pure { + 1 structSuffix; + 1 arraySuffix; + 1 mappingSuffix; + } +} +// ---- +// TypeError 7251: (77-88): Literal suffix functions can only return value types and reference types stored in memory. +// TypeError 7251: (202-219): Literal suffix functions can only return value types and reference types stored in memory. +// TypeError 7251: (335-366): Literal suffix functions can only return value types and reference types stored in memory. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/signed_exponent.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/signed_exponent.sol new file mode 100644 index 000000000..d2473ab2a --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/signed_exponent.sol @@ -0,0 +1,38 @@ +function s8(uint mantissa, int8 exponent) pure suffix returns (uint) { } +function s64(uint mantissa, int64 exponent) pure suffix returns (uint) { } +function s160(uint mantissa, int160 exponent) pure suffix returns (uint) { } +function s256(uint mantissa, int256 exponent) pure suffix returns (uint) { } +function ms64(int64 mantissa, int8 exponent) pure suffix returns (uint) { } +function ms160(int160 mantissa, int160 exponent) pure suffix returns (uint) { } +function ms256(int256 mantissa, int256 exponent) pure suffix returns (uint) { } +function mu64(uint64 mantissa, int8 exponent) pure suffix returns (uint) { } +function mu160(uint160 mantissa, int160 exponent) pure suffix returns (uint) { } +function mu256(uint256 mantissa, int256 exponent) pure suffix returns (uint) { } + +contract C { + function f() public pure { + 3.1415 s8; + 3.1415 s64; + 3.1415 s160; + 3.1415 s256; + + 1.6180 ms64; + 1.6180 ms160; + 1.6180 ms256; + + 2.7182 mu64; + 2.7182 mu160; + 2.7182 mu256; + } +} +// ---- +// TypeError 3123: (27-31): The exponent parameter of a literal suffix function must be unsigned. Exponent is always either zero or a negative power of 10 but the parameter represents its absolute value. +// TypeError 3123: (101-106): The exponent parameter of a literal suffix function must be unsigned. Exponent is always either zero or a negative power of 10 but the parameter represents its absolute value. +// TypeError 3123: (177-183): The exponent parameter of a literal suffix function must be unsigned. Exponent is always either zero or a negative power of 10 but the parameter represents its absolute value. +// TypeError 3123: (254-260): The exponent parameter of a literal suffix function must be unsigned. Exponent is always either zero or a negative power of 10 but the parameter represents its absolute value. +// TypeError 3123: (332-336): The exponent parameter of a literal suffix function must be unsigned. Exponent is always either zero or a negative power of 10 but the parameter represents its absolute value. +// TypeError 3123: (410-416): The exponent parameter of a literal suffix function must be unsigned. Exponent is always either zero or a negative power of 10 but the parameter represents its absolute value. +// TypeError 3123: (490-496): The exponent parameter of a literal suffix function must be unsigned. Exponent is always either zero or a negative power of 10 but the parameter represents its absolute value. +// TypeError 3123: (569-573): The exponent parameter of a literal suffix function must be unsigned. Exponent is always either zero or a negative power of 10 but the parameter represents its absolute value. +// TypeError 3123: (648-654): The exponent parameter of a literal suffix function must be unsigned. Exponent is always either zero or a negative power of 10 but the parameter represents its absolute value. +// TypeError 3123: (729-735): The exponent parameter of a literal suffix function must be unsigned. Exponent is always either zero or a negative power of 10 but the parameter represents its absolute value. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/too_few_parameters.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/too_few_parameters.sol new file mode 100644 index 000000000..22674809c --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/too_few_parameters.sol @@ -0,0 +1,11 @@ +function zero() pure suffix returns (uint) { return 1; } + +contract C { + function f() public pure { + 1 zero; + 1.1 zero; + "a" zero; + } +} +// ---- +// TypeError 9128: (13-15): Functions that take no arguments cannot be used as literal suffixes. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/too_many_parameters.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/too_many_parameters.sol new file mode 100644 index 000000000..12aafa93b --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/too_many_parameters.sol @@ -0,0 +1,30 @@ +function uintUintUintSuffix(uint, uint, uint) pure suffix returns (uint) { return 1; } +function stringStringStringSuffix(string memory, string memory, string memory) pure suffix returns (uint) { return 1; } +function uintStringSuffix(uint, string memory) pure suffix returns (uint) { return 1; } +function stringUintSuffix(string memory, uint) pure suffix returns (uint) { return 1; } + +contract C { + function f() public pure { + 1 uintUintUintSuffix; + 1 stringStringStringSuffix; + 1 uintStringSuffix; + 1 stringUintSuffix; + + 1.1 uintUintUintSuffix; + 1.1 stringStringStringSuffix; + 1.1 uintStringSuffix; + 1.1 stringUintSuffix; + + "a" uintUintUintSuffix; + "a" stringStringStringSuffix; + "a" uintStringSuffix; + "a" stringUintSuffix; + } +} +// ---- +// TypeError 9128: (27-45): Functions that take 3 or more arguments cannot be used as literal suffixes. +// TypeError 9128: (120-165): Functions that take 3 or more arguments cannot be used as literal suffixes. +// TypeError 1587: (232-253): Literal suffix function has invalid parameter types. The exponent parameter must be an unsigned integer. +// TypeError 1587: (320-341): Literal suffix function has invalid parameter types. The mantissa parameter must be an integer. +// TypeError 2505: (764-780): Functions that take 2 arguments can only be used as literal suffixes for rational numbers. +// TypeError 2505: (794-810): Functions that take 2 arguments can only be used as literal suffixes for rational numbers. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/two_udvt_parameters.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/two_udvt_parameters.sol new file mode 100644 index 000000000..824fd587e --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/two_udvt_parameters.sol @@ -0,0 +1,6 @@ +type M is int; +type E is uint; + +function suffix(M x, E y) pure suffix returns (M) {} +// ---- +// TypeError 1587: (47-57): Literal suffix function has invalid parameter types. The mantissa parameter must be an integer. The exponent parameter must be an unsigned integer. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/type_mismatch.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/type_mismatch.sol new file mode 100644 index 000000000..78b339e50 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/type_mismatch.sol @@ -0,0 +1,106 @@ +function uintSuffix(uint) pure suffix returns (uint) { return 1; } +function int8Suffix(int8) pure suffix returns (uint) { return 1; } +function boolSuffix(bool) pure suffix returns (uint) { return 1; } +function addressSuffix(address) pure suffix returns (uint) { return 1; } +function decimalSuffix(uint, uint) pure suffix returns (uint) { return 1; } +function stringSuffix(string memory) pure suffix returns (uint) { return 1; } +function bytesSuffix(bytes memory) pure suffix returns (uint) { return 1; } + +contract C { + function f() public pure { + 1 uintSuffix; // allowed + 1 int8Suffix; // allowed + 1 boolSuffix; + 1 addressSuffix; + 1 decimalSuffix; // allowed + 1 stringSuffix; + 1 bytesSuffix; + + 1024 uintSuffix; // allowed + 1024 int8Suffix; + 1024 boolSuffix; + 1024 addressSuffix; + 1024 decimalSuffix; // allowed + 1024 stringSuffix; + 1024 bytesSuffix; + + true uintSuffix; + true int8Suffix; + true boolSuffix; // allowed + true addressSuffix; + true decimalSuffix; + true stringSuffix; + true bytesSuffix; + + 0x1234567890123456789012345678901234567890 uintSuffix; + 0x1234567890123456789012345678901234567890 int8Suffix; + 0x1234567890123456789012345678901234567890 boolSuffix; + 0x1234567890123456789012345678901234567890 addressSuffix; // allowed + 0x1234567890123456789012345678901234567890 decimalSuffix; + 0x1234567890123456789012345678901234567890 stringSuffix; + 0x1234567890123456789012345678901234567890 bytesSuffix; + + 1.1 uintSuffix; + 1.1 int8Suffix; + 1.1 boolSuffix; + 1.1 addressSuffix; + 1.1 decimalSuffix; // allowed + 1.1 stringSuffix; + 1.1 bytesSuffix; + + "a" uintSuffix; + "a" int8Suffix; + "a" boolSuffix; + "a" addressSuffix; + "a" decimalSuffix; + "a" stringSuffix; // allowed + "a" bytesSuffix; // allowed + + hex"abcd" uintSuffix; + hex"abcd" int8Suffix; + hex"abcd" boolSuffix; + hex"abcd" addressSuffix; + hex"abcd" decimalSuffix; + hex"abcd" stringSuffix; + hex"abcd" bytesSuffix; // allowed + } +} +// ---- +// TypeError 8838: (635-636): The number cannot be converted to type bool accepted by the suffix function. +// TypeError 8838: (657-658): The number cannot be converted to type address accepted by the suffix function. +// TypeError 8838: (721-722): The number cannot be converted to type string accepted by the suffix function. +// TypeError 8838: (745-746): The number cannot be converted to type bytes accepted by the suffix function. +// TypeError 8838: (808-812): The number is out of range of type int8 accepted by the suffix function. +// TypeError 8838: (833-837): The number cannot be converted to type bool accepted by the suffix function. +// TypeError 8838: (858-862): The number cannot be converted to type address accepted by the suffix function. +// TypeError 8838: (925-929): The number cannot be converted to type string accepted by the suffix function. +// TypeError 8838: (952-956): The number cannot be converted to type bytes accepted by the suffix function. +// TypeError 8838: (979-983): The literal cannot be converted to type uint256 accepted by the suffix function. +// TypeError 8838: (1004-1008): The literal cannot be converted to type int8 accepted by the suffix function. +// TypeError 8838: (1068-1072): The literal cannot be converted to type address accepted by the suffix function. +// TypeError 2505: (1101-1114): Functions that take 2 arguments can only be used as literal suffixes for rational numbers. +// TypeError 8838: (1124-1128): The literal cannot be converted to type string accepted by the suffix function. +// TypeError 8838: (1151-1155): The literal cannot be converted to type bytes accepted by the suffix function. +// TypeError 8838: (1178-1220): The address cannot be converted to type uint256 accepted by the suffix function. +// TypeError 8838: (1241-1283): The address cannot be converted to type int8 accepted by the suffix function. +// TypeError 8838: (1304-1346): The address cannot be converted to type bool accepted by the suffix function. +// TypeError 2505: (1487-1500): Functions that take 2 arguments can only be used as literal suffixes for rational numbers. +// TypeError 8838: (1510-1552): The address cannot be converted to type string accepted by the suffix function. +// TypeError 8838: (1575-1617): The address cannot be converted to type bytes accepted by the suffix function. +// TypeError 8838: (1640-1643): The number cannot be converted to type uint256 accepted by the suffix function. +// TypeError 8838: (1664-1667): The number cannot be converted to type int8 accepted by the suffix function. +// TypeError 8838: (1688-1691): The number cannot be converted to type bool accepted by the suffix function. +// TypeError 8838: (1712-1715): The number cannot be converted to type address accepted by the suffix function. +// TypeError 8838: (1777-1780): The number cannot be converted to type string accepted by the suffix function. +// TypeError 8838: (1803-1806): The number cannot be converted to type bytes accepted by the suffix function. +// TypeError 8838: (1829-1832): The literal cannot be converted to type uint256 accepted by the suffix function. +// TypeError 8838: (1853-1856): The literal cannot be converted to type int8 accepted by the suffix function. +// TypeError 8838: (1877-1880): The literal cannot be converted to type bool accepted by the suffix function. +// TypeError 8838: (1901-1904): The literal cannot be converted to type address accepted by the suffix function. +// TypeError 2505: (1932-1945): Functions that take 2 arguments can only be used as literal suffixes for rational numbers. +// TypeError 8838: (2032-2041): The literal cannot be converted to type uint256 accepted by the suffix function. +// TypeError 8838: (2062-2071): The literal cannot be converted to type int8 accepted by the suffix function. +// TypeError 8838: (2092-2101): The literal cannot be converted to type bool accepted by the suffix function. +// TypeError 8838: (2122-2131): The literal cannot be converted to type address accepted by the suffix function. +// TypeError 2505: (2165-2178): Functions that take 2 arguments can only be used as literal suffixes for rational numbers. +// TypeError 8838: (2188-2197): The literal cannot be converted to type string accepted by the suffix function. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/with_abi_encode_multiple_return_parameters.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/with_abi_encode_multiple_return_parameters.sol new file mode 100644 index 000000000..221ee21a1 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/with_abi_encode_multiple_return_parameters.sol @@ -0,0 +1,20 @@ +function uintUintSuffix(uint x) pure suffix returns (uint, uint) { return (x, x); } + +contract C { + function g(uint, uint) public {} + + function f() public { + abi.encode(1 uintUintSuffix); + abi.encodePacked(2 uintUintSuffix); + abi.encodeWithSelector(0x12345678, 3 uintUintSuffix); + abi.encodeWithSignature("f()", 4 uintUintSuffix); + abi.encodeCall(this.g, 5 uintUintSuffix); + } +} +// ---- +// TypeError 7848: (52-64): Literal suffix functions must return exactly one value. +// TypeError 2056: (181-197): This type cannot be encoded. +// TypeError 2056: (225-241): This type cannot be encoded. +// TypeError 2056: (287-303): This type cannot be encoded. +// TypeError 2056: (345-361): This type cannot be encoded. +// TypeError 9062: (395-411): Expected an inline tuple, not an expression of a tuple type. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parameters/with_abi_encode_no_return_parameters.sol b/test/libsolidity/syntaxTests/literalSuffixes/parameters/with_abi_encode_no_return_parameters.sol new file mode 100644 index 000000000..f0e251c6d --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parameters/with_abi_encode_no_return_parameters.sol @@ -0,0 +1,23 @@ +function nullSuffix(uint) pure suffix {} + +contract C { + function g() public {} + + function h() public returns (uint, uint) {} + + event E(); + function f() public { + abi.encode(1 nullSuffix); + abi.encodePacked(2 nullSuffix); + abi.encodeWithSelector(0x12345678, 3 nullSuffix); + abi.encodeWithSignature("f()", 4 nullSuffix); + abi.encodeCall(this.g, 5 nullSuffix); + } +} +// ---- +// TypeError 7848: (38-38): Literal suffix functions must return exactly one value. +// TypeError 2056: (192-204): This type cannot be encoded. +// TypeError 2056: (232-244): This type cannot be encoded. +// TypeError 2056: (290-302): This type cannot be encoded. +// TypeError 2056: (344-356): This type cannot be encoded. +// TypeError 9062: (390-402): Expected an inline tuple, not an expression of a tuple type. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_error.sol b/test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_error.sol new file mode 100644 index 000000000..50927a89a --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_error.sol @@ -0,0 +1,3 @@ +error E1(uint) suffix; +// ---- +// ParserError 2314: (15-21): Expected ';' but got identifier diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_event.sol b/test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_event.sol new file mode 100644 index 000000000..e1f3f822d --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_event.sol @@ -0,0 +1,5 @@ +contract C { + event E(uint) suffix; +} +// ---- +// ParserError 2314: (31-37): Expected ';' but got identifier diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_function_in_contract.sol b/test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_function_in_contract.sol new file mode 100644 index 000000000..20ddc75d6 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_function_in_contract.sol @@ -0,0 +1,5 @@ +contract C { + function f(uint) internal pure suffix returns (uint) {} +} +// ---- +// DeclarationError 7920: (48-54): Identifier not found or not unique. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_function_in_interface.sol b/test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_function_in_interface.sol new file mode 100644 index 000000000..04ae8ad3a --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_function_in_interface.sol @@ -0,0 +1,6 @@ +interface I { + function f(uint) external pure suffix returns (uint) {} +} +// ---- +// SyntaxError 5842: (18-73): Functions in interfaces cannot have modifiers. +// DeclarationError 7920: (49-55): Identifier not found or not unique. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_function_in_library.sol b/test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_function_in_library.sol new file mode 100644 index 000000000..3d10d7207 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_function_in_library.sol @@ -0,0 +1,5 @@ +library L { + function f(uint) internal pure suffix returns (uint) {} +} +// ---- +// DeclarationError 7920: (47-53): Identifier not found or not unique. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_function_pointer.sol b/test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_function_pointer.sol new file mode 100644 index 000000000..5ceaf5a6e --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_function_pointer.sol @@ -0,0 +1,5 @@ +contract C { + function (uint) pure suffix returns (uint) ptr; +} +// ---- +// ParserError 2314: (45-52): Expected ';' but got 'returns' diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_function_with_repeated_suffix_modifier.sol b/test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_function_with_repeated_suffix_modifier.sol new file mode 100644 index 000000000..a9159fdd5 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_function_with_repeated_suffix_modifier.sol @@ -0,0 +1,9 @@ +function suffix1(uint) pure suffix suffix returns (uint) {} +function suffix2(uint) suffix pure suffix returns (uint) {} +function suffix3(uint) suffix pure suffix suffix suffix returns (uint) {} +// ---- +// ParserError 2878: (35-41): Suffix already specified. +// ParserError 2878: (95-101): Suffix already specified. +// ParserError 2878: (155-161): Suffix already specified. +// ParserError 2878: (162-168): Suffix already specified. +// ParserError 2878: (169-175): Suffix already specified. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_modifier.sol b/test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_modifier.sol new file mode 100644 index 000000000..a2e728587 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_modifier.sol @@ -0,0 +1,5 @@ +contract C { + modifier m(uint) suffix {} +} +// ---- +// ParserError 2314: (34-40): Expected '{' but got identifier diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_on_state_variable.sol b/test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_on_state_variable.sol new file mode 100644 index 000000000..4209b546e --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parsing/invalid_suffix_on_state_variable.sol @@ -0,0 +1,5 @@ +contract C { + uint suffix a; +} +// ---- +// ParserError 2314: (29-30): Expected ';' but got identifier diff --git a/test/libsolidity/syntaxTests/literalSuffixes/parsing/suffix_function_modifier_location.sol b/test/libsolidity/syntaxTests/literalSuffixes/parsing/suffix_function_modifier_location.sol new file mode 100644 index 000000000..991ee695d --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/parsing/suffix_function_modifier_location.sol @@ -0,0 +1,2 @@ +function suffix1(uint) pure suffix returns (uint) {} +function suffix2(uint) suffix pure returns (uint) {} diff --git a/test/libsolidity/syntaxTests/literalSuffixes/shadowed_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/shadowed_suffix.sol new file mode 100644 index 000000000..58b53d9cf --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/shadowed_suffix.sol @@ -0,0 +1,22 @@ +function s(uint value) pure suffix returns (uint) { return value; } +function z(uint value) pure suffix returns (uint) { return value; } +function q(uint value) pure suffix returns (uint) { return value; } + +contract C { + address z; + + function q() internal {} + + function f() public { + uint s; + + 1 s; + 2 z; + 3 q; + } +} +// ---- +// Warning 2519: (298-304): This declaration shadows an existing declaration. +// Warning 2519: (222-231): This declaration shadows an existing declaration. +// Warning 2519: (238-262): This declaration shadows an existing declaration. +// TypeError 5704: (315-318): Integer cannot be used as a literal suffix. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/suffix_naming.sol b/test/libsolidity/syntaxTests/literalSuffixes/suffix_naming.sol new file mode 100644 index 000000000..d73382479 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/suffix_naming.sol @@ -0,0 +1,27 @@ +function s(uint x) pure suffix returns (uint) { return x; } +function S(uint x) pure suffix returns (uint) { return x; } +function suffix(uint x) pure suffix returns (uint) { return x; } +function SUFFIX(uint x) pure suffix returns (uint) { return x; } +function suffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffix(uint x) pure suffix returns (uint) { return x; } +function __(uint x) pure suffix returns (uint) { return x; } +function _____________________________________(uint x) pure suffix returns (uint) { return x; } +function _s_(uint x) pure suffix returns (uint) { return x; } +function $(uint x) pure suffix returns (uint) { return x; } +function _$(uint x) pure suffix returns (uint) { return x; } +function abcdef(uint x) pure suffix returns (uint) { return x; } + +contract C { + function f() public pure { + 1000 s; + 1000 S; + 1000 suffix; + 1000 SUFFIX; + 1000 suffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffix; + 1000 __; + 1000 _____________________________________; + 1000 _s_; + 1000 $; + 1000 _$; + 0x1000_abcdef abcdef; + } +} diff --git a/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_address_as_address_payable.sol b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_address_as_address_payable.sol new file mode 100644 index 000000000..ada6368e3 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_address_as_address_payable.sol @@ -0,0 +1,10 @@ +function suffix(address payable a) pure suffix returns (address payable) { return a; } + +contract C { + function f() public pure { + 0x1234567890123456789012345678901234567890 suffix; + } +} +// ---- +// TypeError 2998: (16-33): This literal suffix function is not usable as a suffix because no literal is implicitly convertible to its parameter type. +// TypeError 8838: (140-182): The address cannot be converted to type address payable accepted by the suffix function. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_address_as_uint.sol b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_address_as_uint.sol new file mode 100644 index 000000000..b94d15046 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_address_as_uint.sol @@ -0,0 +1,7 @@ +function suffix(uint value) pure suffix returns (uint) { return value; } + +contract C { + uint x = 0x1234567890123456789012345678901234567890 suffix; +} +// ---- +// TypeError 8838: (100-142): The address cannot be converted to type uint256 accepted by the suffix function. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_address_too_few_digits.sol b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_address_too_few_digits.sol new file mode 100644 index 000000000..c74e97e20 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_address_too_few_digits.sol @@ -0,0 +1,7 @@ +function suffix(address value) pure suffix returns (address) { return value; } + +contract C { + address x = 0x123456789012345678901234567890123456789 suffix; +} +// ---- +// SyntaxError 9429: (109-150): This looks like an address but is not exactly 40 hex digits. It is 39 hex digits. If this is not used as an address, please prepend '00'. For more information please see https://docs.soliditylang.org/en/develop/types.html#address-literals diff --git a/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_address_too_many_digits.sol b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_address_too_many_digits.sol new file mode 100644 index 000000000..09a85f8e3 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_address_too_many_digits.sol @@ -0,0 +1,7 @@ +function suffix(address value) pure suffix returns (address) { return value; } + +contract C { + address x = 0x12345678901234567890123456789012345678901 suffix; +} +// ---- +// SyntaxError 9429: (109-152): This looks like an address but is not exactly 40 hex digits. It is 41 hex digits. If this is not used as an address, please prepend '00'. For more information please see https://docs.soliditylang.org/en/develop/types.html#address-literals diff --git a/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_address_wrong_checksum.sol b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_address_wrong_checksum.sol new file mode 100644 index 000000000..8dc3a1542 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_address_wrong_checksum.sol @@ -0,0 +1,7 @@ +function suffix(address value) pure suffix returns (address) { return value; } + +contract C { + address x = 0xffffffffffffffffffffffffffffffffffffffff suffix; +} +// ---- +// SyntaxError 9429: (109-151): This looks like an address but has an invalid checksum. Correct checksummed address: "0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF". If this is not used as an address, please prepend '00'. For more information please see https://docs.soliditylang.org/en/develop/types.html#address-literals diff --git a/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_array_literal.sol b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_array_literal.sol new file mode 100644 index 000000000..a176952ff --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_array_literal.sol @@ -0,0 +1,7 @@ +function suffix(uint[1] memory) pure suffix returns (uint[1] memory) {} + +contract C { + uint[1] x = [42] suffix; +} +// ---- +// ParserError 2314: (107-113): Expected ';' but got identifier diff --git a/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_decimal_mantissa_too_large.sol b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_decimal_mantissa_too_large.sol new file mode 100644 index 000000000..23395e85c --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_decimal_mantissa_too_large.sol @@ -0,0 +1,12 @@ +struct Decimal { + uint mantissa; + uint exponent; +} + +function suffix(uint mantissa, uint exponent) pure suffix returns (Decimal memory) { return Decimal(mantissa, exponent); } + +contract C { + Decimal x = 0.115792089237316195423570985008687907853269984665640564039457584007913129639936 suffix; // 2**256 * 10**-78 +} +// ---- +// TypeError 8838: (211-291): This number cannot be decomposed into a mantissa and decimal exponent that fit the range of parameters of any possible suffix function. The mantissa is out of range of the largest supported integer type. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_decimal_octal.sol b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_decimal_octal.sol new file mode 100644 index 000000000..f510ef183 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_decimal_octal.sol @@ -0,0 +1,7 @@ +function suffix(uint value) pure suffix returns (uint) { return value; } + +contract C { + uint x = 000.10 suffix; +} +// ---- +// ParserError 8936: (100-101): Octal numbers not allowed. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_integer_octal.sol b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_integer_octal.sol new file mode 100644 index 000000000..ac7c7fc0f --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_integer_octal.sol @@ -0,0 +1,7 @@ +function suffix(uint value) pure suffix returns (uint) { return value; } + +contract C { + uint x = 01_23_45 suffix; +} +// ---- +// ParserError 8936: (100-101): Octal numbers not allowed. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_integer_octal_zero.sol b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_integer_octal_zero.sol new file mode 100644 index 000000000..b924641eb --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_integer_octal_zero.sol @@ -0,0 +1,7 @@ +function suffix(uint value) pure suffix returns (uint) { return value; } + +contract C { + uint x = 00 suffix; +} +// ---- +// ParserError 8936: (100-101): Octal numbers not allowed. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_integer_too_large.sol b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_integer_too_large.sol new file mode 100644 index 000000000..a101e9c4d --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_integer_too_large.sol @@ -0,0 +1,9 @@ +function suffix(uint x) pure suffix returns (uint) { return x; } + +contract C { + uint x = 10e1000 suffix; + uint y = 999999999999999999999999999999999999999999999999999999999999999999999999999999 suffix; +} +// ---- +// TypeError 8838: (92-99): The number is out of range of type uint256 accepted by the suffix function. +// TypeError 8838: (121-199): The number is out of range of type uint256 accepted by the suffix function. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_negative_as_unsigned.sol b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_negative_as_unsigned.sol new file mode 100644 index 000000000..8ba76265d --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_negative_as_unsigned.sol @@ -0,0 +1,31 @@ +function asUint(uint x) pure suffix returns (uint) {} +function asSint(int x) pure suffix returns (uint) {} +function asUdec(uint m, uint e) pure suffix returns (uint) {} +function asSdec(int m, uint e) pure suffix returns (uint) {} + +contract C { + function f() public pure { + 1 asUint; + 1 asSint; + 1 asUdec; + 1 asSdec; + + -1 asUint; + -1 asSint; + -1 asUdec; + -1 asSdec; + + 1.1 asUdec; + 1.1 asSdec; + + -1.1 asUdec; + -1.1 asSdec; + } +} +// ---- +// TypeError 4907: (356-365): Built-in unary operator - cannot be applied to type uint256. Unary negation is only allowed for signed integers. +// TypeError 4907: (375-384): Built-in unary operator - cannot be applied to type uint256. Unary negation is only allowed for signed integers. +// TypeError 4907: (394-403): Built-in unary operator - cannot be applied to type uint256. Unary negation is only allowed for signed integers. +// TypeError 4907: (413-422): Built-in unary operator - cannot be applied to type uint256. Unary negation is only allowed for signed integers. +// TypeError 4907: (474-485): Built-in unary operator - cannot be applied to type uint256. Unary negation is only allowed for signed integers. +// TypeError 4907: (495-506): Built-in unary operator - cannot be applied to type uint256. Unary negation is only allowed for signed integers. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_parenthesized_literal.sol b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_parenthesized_literal.sol new file mode 100644 index 000000000..c60bc8642 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_parenthesized_literal.sol @@ -0,0 +1,9 @@ +function suffix(uint) pure suffix returns (uint) {} + +contract C { + function f() public { + (1) suffix; + } +} +// ---- +// ParserError 2314: (104-110): Expected ';' but got identifier diff --git a/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_string_hex.sol b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_string_hex.sol new file mode 100644 index 000000000..898c3125a --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_string_hex.sol @@ -0,0 +1,7 @@ +function suffix(string memory value) pure suffix returns (string memory) { return value; } + +contract C { + string x = hex"abcd" suffix; +} +// ---- +// TypeError 8838: (120-129): The literal cannot be converted to type string accepted by the suffix function. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_tuple_literal.sol b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_tuple_literal.sol new file mode 100644 index 000000000..7d8aa08fc --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/invalid_suffixed_tuple_literal.sol @@ -0,0 +1,9 @@ +function suffix(uint, uint) pure suffix returns (uint) {} + +contract C { + function f() public { + (1, 2) suffix; + } +} +// ---- +// ParserError 2314: (113-119): Expected ';' but got identifier diff --git a/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/suffixed_address.sol b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/suffixed_address.sol new file mode 100644 index 000000000..288adc3ac --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/suffixed_address.sol @@ -0,0 +1,11 @@ +function suffix(address a) pure suffix returns (address) { return a; } + +contract C { + function f() public pure { + 0x0000000000000000000000000000000000000000 suffix; + 0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF suffix; + 0x1234567890123456789012345678901234567890 suffix; + + 0x1234567890_1234567890_1234567890_1234567890 suffix; + } +} diff --git a/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/suffixed_boolean.sol b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/suffixed_boolean.sol new file mode 100644 index 000000000..6e45a3cbb --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/suffixed_boolean.sol @@ -0,0 +1,8 @@ +function suffix(bool x) pure suffix returns (bool) {} + +contract C { + function f() public pure { + true suffix; + false suffix; + } +} diff --git a/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/suffixed_bytes.sol b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/suffixed_bytes.sol new file mode 100644 index 000000000..feffb4119 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/suffixed_bytes.sol @@ -0,0 +1,12 @@ +function suffix(bytes memory value) pure suffix returns (bytes memory) { return value; } + +contract C { + function f() public pure { + "" suffix; + '' suffix; + "abcd" suffix; + 'abcd' suffix; + hex"abcd" suffix; + unicode"😃" suffix; + } +} diff --git a/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/suffixed_decimal.sol b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/suffixed_decimal.sol new file mode 100644 index 000000000..edd3b996e --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/suffixed_decimal.sol @@ -0,0 +1,59 @@ +struct Decimal { + uint mantissa; + uint exponent; +} + +function e(uint mantissa, uint exponent) pure suffix returns (Decimal memory) { + return Decimal(mantissa, exponent); +} + +contract C { + function f() public pure { + 0.1 e; + 0.100000 e; + 0.123456 e; + 0.0000000000000000000000000000000000000000000000000000000000000000000000000000001 e; + 0.115792089237316195423570985008687907853269984665640564039457584007913129639935 e; // (2**256 - 1) * 10**-78 + + // Decimal with separators + 1_2_3_4_5_6_7_8_9_0.1_2_3_4_5_6_7_8_9_0 e; + 1_000.1234 e; + 1_000.123_456 e; + 1_000_000.123 e; + 1_000_000.123_456_789 e; + + // Scientific notation + 1e-01 e; + 1e-1 e; + 1e-10 e; + 1234e-10 e; + 1e-80 e; + + // Scientific notation with decimals + 0.1e0 e; + 0.1e-0 e; + 0.1e-1 e; + 0.1e-10 e; + 1.1e0 e; + 10.1e0 e; + 100.1_111e-2 e; + 10.000000000000111e10 e; + + 1.23e0 e; + 1.23e1 e; + 1.23e-1 e; + 10.1e-1 e; + 1000.1e-0003 e; + 1200.1e-2 e; + 0.00115792089237316195423570985008687907853269984665640564039457584007913129639935e2 e; // (2**256 - 1) * 10**-80 * 10**2 + 0.00115792089237316195423570985008687907853269984665640564039457584007913129639935e-2 e; // (2**256 - 1) * 10**-80 * 10**-2 + + // Scientific notation with separators + 1_2_34e-10 e; + 1_0.123456789123e1_0 e; + 1.123_456e3 e; + 10_000_000_000.123456789123e1_0 e; + 10_000_000_000.1_234_56789_123e1_0 e; + 10_000_000_000.1e-0_0_0_1_0 e; + } +} diff --git a/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/suffixed_integer.sol b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/suffixed_integer.sol new file mode 100644 index 000000000..4bb787b6c --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/suffixed_integer.sol @@ -0,0 +1,80 @@ +function e(uint x) pure suffix returns (uint) { return x; } + +contract C { + function f() public pure { + // Zero and non-zero number + 0 e; + 1 e; + 1000 e; + 115792089237316195423570985008687907853269984665640564039457584007913129639935 e; // 2**256 - 1 + 0.0 e; + 0.00 e; + 1.0000 e; + 9999.0 e; + + // Hexadecimal + 0x0 e; + 0x0000 e; + 0x1234 e; + 0xffffff e; + 0xFFFFFF e; + 0xFfFfFf e; + + // Almost address + 0x000012345678901234567890123456789012345678 e; + 0x12345678901234567890123456789012345678 e; + + // Hexadecimal that resembles scientific notation + 0x0e0 e; + 0x0E0 e; + 0x111e0 e; + 0xeeeee e; + 0xEeEeE e; + 0x10e10 e; + 0x10e76 e; + + // Number with separators + 1_2_3_4_5_6_7_8_9_0 e; + 1_000 e; + 1_000_000 e; + 9999_9999_9999 e; + 0x123_abc e; + 0x123_ABC e; + 0x123_aBc e; + 1_000.0 e; + 1_000.000_000 e; + + // Scientific notation + 0e0 e; + 0e-0 e; + 0e-1 e; + 0e-10 e; + 1e0 e; + 10e0 e; + 10E0 e; + + 10e10 e; + 10e76 e; + + 10e-1 e; + 1000e-0003 e; + 1200e-2 e; + + // Scientific notation with decimals + 0.0e0 e; + 0.0e-0 e; + 0.0e-1 e; + 0.0e-10 e; + 1.0e0 e; + 1.0e2 e; + 10.0e0 e; + 100.0_000e-2 e; + 1.23e2 e; + 0.00115792089237316195423570985008687907853269984665640564039457584007913129639935e80 e; // (2**256 - 1) * 10**-80 * 10**80 + + // Scientific notation with separators + 1_0e1_0 e; + 10_000_000_000e1_0 e; + 10_000_000_000e-0_0_0_1_0 e; + } +} diff --git a/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/suffixed_negative_as_signed.sol b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/suffixed_negative_as_signed.sol new file mode 100644 index 000000000..609a1b81c --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/suffixed_negative_as_signed.sol @@ -0,0 +1,24 @@ +function asUint(uint x) pure suffix returns (int) {} +function asSint(int x) pure suffix returns (int) {} +function asUdec(uint m, uint e) pure suffix returns (int) {} +function asSdec(int m, uint e) pure suffix returns (int) {} + +contract C { + function f() public pure { + 1 asUint; + 1 asSint; + 1 asUdec; + 1 asSdec; + + -1 asUint; + -1 asSint; + -1 asUdec; + -1 asSdec; + + 1.1 asUdec; + 1.1 asSdec; + + -1.1 asUdec; + -1.1 asSdec; + } +} diff --git a/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/suffixed_string.sol b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/suffixed_string.sol new file mode 100644 index 000000000..951788173 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/suffixableLiterals/suffixed_string.sol @@ -0,0 +1,12 @@ +function suffix(string memory value) pure suffix returns (string memory) { return value; } + +contract C { + function f() public pure { + "" suffix; + '' suffix; + "abcd" suffix; + 'abcd' suffix; + //hex"abcd" suffix; // Hex literals are only implicitly convertible to bytes + unicode"😃" suffix; + } +} diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/imported_function_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/imported_function_as_suffix.sol new file mode 100644 index 000000000..81649d168 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/imported_function_as_suffix.sol @@ -0,0 +1,16 @@ +==== Source: A.sol ==== +function s(uint) pure suffix returns (uint) { return 1; } +==== Source: B.sol ==== +import {s} from "A.sol"; +import {s as z} from "A.sol"; +import "A.sol" as A; +import "B.sol" as B; + +contract C { + function f() pure public { + 1 s; + 2 z; + 3 A.s; + 4 B.B.B.A.s; + } +} diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_address_send_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_address_send_as_suffix.sol new file mode 100644 index 000000000..2627be926 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_address_send_as_suffix.sol @@ -0,0 +1,7 @@ +contract C { + function f() pure public { + 1 0x1234567890123456789012345678901234567890.send; + } +} +// ---- +// ParserError 2314: (54-96): Expected ';' but got 'Number' diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_bound_free_function_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_bound_free_function_as_suffix.sol new file mode 100644 index 000000000..99f64b40b --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_bound_free_function_as_suffix.sol @@ -0,0 +1,10 @@ +function suffix(uint x, uint y) pure returns (uint) { return x + y; } + +contract C { + using {suffix} for uint; + + uint a = 42; + uint b = 1000 a.suffix; +} +// ---- +// TypeError 4438: (149-157): The literal suffix must be either a subdenomination or a file-level suffix function. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_bound_free_suffix_function_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_bound_free_suffix_function_as_suffix.sol new file mode 100644 index 000000000..d6e738ae2 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_bound_free_suffix_function_as_suffix.sol @@ -0,0 +1,10 @@ +function suffix(uint x, uint y) pure suffix returns (uint) { return x + y; } + +contract C { + using {suffix} for uint; + + uint a = 42; + uint b = 1000 a.suffix; +} +// ---- +// TypeError 4438: (156-164): The literal suffix must be either a subdenomination or a file-level suffix function. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_bound_library_function_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_bound_library_function_as_suffix.sol new file mode 100644 index 000000000..ec1a3f111 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_bound_library_function_as_suffix.sol @@ -0,0 +1,12 @@ +library L { + function suffix(uint x, uint y) internal pure returns (uint) { return x + y; } +} + +contract C { + using L for uint; + + uint a = 42; + uint b = 1000 a.suffix; +} +// ---- +// TypeError 4438: (169-177): The literal suffix must be either a subdenomination or a file-level suffix function. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_builtin_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_builtin_as_suffix.sol new file mode 100644 index 000000000..9fc39f759 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_builtin_as_suffix.sol @@ -0,0 +1,16 @@ +contract C { + function f() pure public { + hex"abcd" keccak256; + 1 blockhash; + true assert; + 0x1234567890123456789012345678901234567890 selfdestruct; + 1 gasleft; + } +} +// ---- +// TypeError 4438: (62-71): The literal suffix must be either a subdenomination or a file-level suffix function. +// TypeError 4438: (83-92): The literal suffix must be either a subdenomination or a file-level suffix function. +// TypeError 4438: (107-113): The literal suffix must be either a subdenomination or a file-level suffix function. +// Warning 5159: (166-178): "selfdestruct" has been deprecated. The underlying opcode will eventually undergo breaking changes, and its use is not recommended. +// TypeError 4438: (166-178): The literal suffix must be either a subdenomination or a file-level suffix function. +// TypeError 4438: (190-197): The literal suffix must be either a subdenomination or a file-level suffix function. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_denomination_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_denomination_as_suffix.sol new file mode 100644 index 000000000..6d17068c6 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_denomination_as_suffix.sol @@ -0,0 +1,61 @@ +==== Source: A ==== +function gwei(uint x) pure suffix returns (uint) { return x; } + +==== Source: B ==== +function wei(uint x) pure suffix returns (uint) { return x; } + +==== Source: C ==== +function ether(uint x) pure suffix returns (uint) { return x; } + +==== Source: D ==== +function seconds(uint x) pure suffix returns (uint) { return x; } + +==== Source: E ==== +function minutes(uint x) pure suffix returns (uint) { return x; } + +==== Source: F ==== +function hours(uint x) pure suffix returns (uint) { return x; } + +==== Source: G ==== +function days(uint x) pure suffix returns (uint) { return x; } + +==== Source: H ==== +function weeks(uint x) pure suffix returns (uint) { return x; } + +==== Source: I ==== +function years(uint x) pure suffix returns (uint) { return x; } + +==== Source: test.sol ==== +import "A"; +import "B"; +import "C"; +import "D"; +import "E"; +import "F"; +import "G"; +import "H"; +import "I"; + +contract C { + function f() public pure { + 1 wei; + 1 gwei; + 1 ether; + 1 seconds; + 1 minutes; + 1 hours; + 1 days; + 1 weeks; + 1 years; + } +} +// ---- +// ParserError 2314: (A:9-13): Expected identifier but got 'gwei' +// ParserError 2314: (B:9-12): Expected identifier but got 'wei' +// ParserError 2314: (C:9-14): Expected identifier but got 'ether' +// ParserError 2314: (D:9-16): Expected identifier but got 'seconds' +// ParserError 2314: (E:9-16): Expected identifier but got 'minutes' +// ParserError 2314: (F:9-14): Expected identifier but got 'hours' +// ParserError 2314: (G:9-13): Expected identifier but got 'days' +// ParserError 2314: (H:9-14): Expected identifier but got 'weeks' +// ParserError 2314: (I:9-14): Expected identifier but got 'years' diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_enum_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_enum_as_suffix.sol new file mode 100644 index 000000000..a18e75ee7 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_enum_as_suffix.sol @@ -0,0 +1,7 @@ +enum E { A, B, C} + +contract C { + uint a = 1000 E; +} +// ---- +// TypeError 6469: (45-51): Type cannot be used as a literal suffix. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_error_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_error_as_suffix.sol new file mode 100644 index 000000000..f19c2d7b2 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_error_as_suffix.sol @@ -0,0 +1,8 @@ +error E(uint x); + +contract C { + uint a = 1000 E; +} +// ---- +// TypeError 4438: (49-50): The literal suffix must be either a subdenomination or a file-level suffix function. +// TypeError 7407: (44-50): Type tuple() is not implicitly convertible to expected type uint256. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_event_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_event_as_suffix.sol new file mode 100644 index 000000000..cdf2898a7 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_event_as_suffix.sol @@ -0,0 +1,8 @@ +contract C { + event E(uint x); + + uint a = 1000 E; +} +// ---- +// TypeError 4438: (53-54): The literal suffix must be either a subdenomination or a file-level suffix function. +// TypeError 7407: (48-54): Type tuple() is not implicitly convertible to expected type uint256. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_explicit_conversion_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_explicit_conversion_as_suffix.sol new file mode 100644 index 000000000..138962056 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_explicit_conversion_as_suffix.sol @@ -0,0 +1,7 @@ +contract C { + function f() pure public { + 1 uint; + } +} +// ---- +// ParserError 2314: (54-58): Expected ';' but got 'uint' diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_external_contract_function_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_external_contract_function_as_suffix.sol new file mode 100644 index 000000000..f03b63c40 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_external_contract_function_as_suffix.sol @@ -0,0 +1,7 @@ +contract C { + uint a = 1000 this.suffix; + + function suffix(uint x) external pure returns (uint) { return x; } +} +// ---- +// TypeError 4438: (31-42): The literal suffix must be either a subdenomination or a file-level suffix function. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_external_library_function_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_external_library_function_as_suffix.sol new file mode 100644 index 000000000..f4b57f693 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_external_library_function_as_suffix.sol @@ -0,0 +1,9 @@ +library L { + function suffix(uint x) external pure returns (uint) { return x; } +} + +contract C { + uint x = 1000 L.suffix; +} +// ---- +// TypeError 4438: (117-125): The literal suffix must be either a subdenomination or a file-level suffix function. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_free_function_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_free_function_as_suffix.sol new file mode 100644 index 000000000..7a9f74ef5 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_free_function_as_suffix.sol @@ -0,0 +1,7 @@ +function suffix(uint x) pure returns (uint) {} + +contract C { + uint a = 1000 suffix; +} +// ---- +// TypeError 4438: (79-85): The literal suffix must be either a subdenomination or a file-level suffix function. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_free_non_payable_function_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_free_non_payable_function_as_suffix.sol new file mode 100644 index 000000000..738b8ffc9 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_free_non_payable_function_as_suffix.sol @@ -0,0 +1,7 @@ +function suffix(uint x) returns (uint) {} + +contract C { + uint a = 1000 suffix; +} +// ---- +// TypeError 4438: (74-80): The literal suffix must be either a subdenomination or a file-level suffix function. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_free_non_payable_suffix_function_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_free_non_payable_suffix_function_as_suffix.sol new file mode 100644 index 000000000..36039f21a --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_free_non_payable_suffix_function_as_suffix.sol @@ -0,0 +1,7 @@ +function suffix(uint x) suffix returns (uint) {} + +contract C { + uint a = 1000 suffix; +} +// ---- +// TypeError 1716: (0-48): Only pure functions can be used as literal suffixes diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_free_payable_function_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_free_payable_function_as_suffix.sol new file mode 100644 index 000000000..34101b04b --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_free_payable_function_as_suffix.sol @@ -0,0 +1,8 @@ +function suffix(uint x) payable returns (uint) {} + +contract C { + uint a = 1000 suffix; +} +// ---- +// TypeError 9559: (0-49): Free functions cannot be payable. +// TypeError 4438: (82-88): The literal suffix must be either a subdenomination or a file-level suffix function. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_free_payable_suffix_function_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_free_payable_suffix_function_as_suffix.sol new file mode 100644 index 000000000..c5706af97 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_free_payable_suffix_function_as_suffix.sol @@ -0,0 +1,8 @@ +function suffix(uint x) payable suffix returns (uint) {} + +contract C { + uint a = 1000 suffix; +} +// ---- +// TypeError 1716: (0-56): Only pure functions can be used as literal suffixes +// TypeError 9559: (0-56): Free functions cannot be payable. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_free_view_function_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_free_view_function_as_suffix.sol new file mode 100644 index 000000000..ef841576d --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_free_view_function_as_suffix.sol @@ -0,0 +1,7 @@ +function suffix(uint x) view returns (uint) {} + +contract C { + uint a = 1000 suffix; +} +// ---- +// TypeError 4438: (79-85): The literal suffix must be either a subdenomination or a file-level suffix function. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_free_view_suffix_function_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_free_view_suffix_function_as_suffix.sol new file mode 100644 index 000000000..ba32c32cf --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_free_view_suffix_function_as_suffix.sol @@ -0,0 +1,7 @@ +function suffix(uint x) view suffix returns (uint) {} + +contract C { + uint a = 1000 suffix; +} +// ---- +// TypeError 1716: (0-53): Only pure functions can be used as literal suffixes diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_function_pointer_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_function_pointer_as_suffix.sol new file mode 100644 index 000000000..581a84c3f --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_function_pointer_as_suffix.sol @@ -0,0 +1,14 @@ +function suffix(uint x) pure suffix returns (uint) { return x; } + +contract C { + function (uint) pure returns (uint) storagePtr = suffix; + + function f() public pure { + function (uint) pure returns (uint) localPtr = suffix; + 1000 localPtr; + 1000 storagePtr; + } +} +// ---- +// TypeError 4438: (248-256): The literal suffix must be either a subdenomination or a file-level suffix function. +// TypeError 4438: (271-281): The literal suffix must be either a subdenomination or a file-level suffix function. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_getter_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_getter_as_suffix.sol new file mode 100644 index 000000000..1fb815f59 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_getter_as_suffix.sol @@ -0,0 +1,7 @@ +contract C { + uint public g; + + uint a = 1 this.g; +} +// ---- +// TypeError 4438: (48-54): The literal suffix must be either a subdenomination or a file-level suffix function. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_internal_contract_function_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_internal_contract_function_as_suffix.sol new file mode 100644 index 000000000..2f50d046c --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_internal_contract_function_as_suffix.sol @@ -0,0 +1,15 @@ +contract B { + function inheritedSuffix(uint x) internal pure returns (uint) { return x; } +} + +contract C is B { + uint a = 1000 suffix; + uint b = 1000 B.inheritedSuffix; + uint c = 1000 C.suffix; + + function suffix(uint x) internal pure returns (uint) { return x; } +} +// ---- +// TypeError 4438: (132-138): The literal suffix must be either a subdenomination or a file-level suffix function. +// TypeError 4438: (158-175): The literal suffix must be either a subdenomination or a file-level suffix function. +// TypeError 4438: (195-203): The literal suffix must be either a subdenomination or a file-level suffix function. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_internal_library_function_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_internal_library_function_as_suffix.sol new file mode 100644 index 000000000..699febb45 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_internal_library_function_as_suffix.sol @@ -0,0 +1,9 @@ +library L { + function suffix(uint x) internal pure returns (uint) { return x; } +} + +contract C { + uint x = 1000 L.suffix; +} +// ---- +// TypeError 4438: (117-125): The literal suffix must be either a subdenomination or a file-level suffix function. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_magic_variable_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_magic_variable_as_suffix.sol new file mode 100644 index 000000000..d64de474b --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_magic_variable_as_suffix.sol @@ -0,0 +1,5 @@ +contract C { + uint a = 1000 msg; +} +// ---- +// TypeError 5704: (26-34): Magic variable cannot be used as a literal suffix. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_mapping_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_mapping_as_suffix.sol new file mode 100644 index 000000000..551e60dc2 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_mapping_as_suffix.sol @@ -0,0 +1,6 @@ +contract C { + mapping (uint => uint) m; + uint a = 1000 m; +} +// ---- +// TypeError 5704: (56-62): Mapping cannot be used as a literal suffix. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_modifier_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_modifier_as_suffix.sol new file mode 100644 index 000000000..78f122ec8 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_modifier_as_suffix.sol @@ -0,0 +1,7 @@ +contract C { + uint a = 1000 suffix; + + modifier suffix(uint x) { _; } +} +// ---- +// TypeError 5704: (26-37): Modifier cannot be used as a literal suffix. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_module_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_module_as_suffix.sol new file mode 100644 index 000000000..577274d50 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_module_as_suffix.sol @@ -0,0 +1,9 @@ +==== Source: A.sol ==== +==== Source: B.sol ==== +import "A.sol" as A; + +contract C { + uint a = 1000 A; +} +// ---- +// TypeError 5704: (B.sol:48-54): Module cannot be used as a literal suffix. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_overloaded_contract_function_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_overloaded_contract_function_as_suffix.sol new file mode 100644 index 000000000..627a6268c --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_overloaded_contract_function_as_suffix.sol @@ -0,0 +1,8 @@ +contract C { + uint a = 1000 suffix; + + function suffix(uint) public pure returns (uint) {} + function suffix(address) public pure returns (uint) {} +} +// ---- +// TypeError 9322: (31-37): No matching declaration found after argument-dependent lookup. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_public_contract_function_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_public_contract_function_as_suffix.sol new file mode 100644 index 000000000..85d57796b --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_public_contract_function_as_suffix.sol @@ -0,0 +1,7 @@ +contract C { + uint a = 1000 suffix; + + function suffix(uint x) public pure returns (uint) { return x; } +} +// ---- +// TypeError 4438: (31-37): The literal suffix must be either a subdenomination or a file-level suffix function. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_revert_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_revert_as_suffix.sol new file mode 100644 index 000000000..95cbc8a95 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_revert_as_suffix.sol @@ -0,0 +1,7 @@ +contract C { + function f() pure public { + 1 revert; + } +} +// ---- +// TypeError 9322: (54-60): No matching declaration found after argument-dependent lookup. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_struct_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_struct_as_suffix.sol new file mode 100644 index 000000000..c7af08926 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_struct_as_suffix.sol @@ -0,0 +1,9 @@ +struct S { + uint x; +} + +contract C { + uint a = 1000 S; +} +// ---- +// TypeError 6469: (52-58): Type cannot be used as a literal suffix. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_suffix_called_delete.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_suffix_called_delete.sol new file mode 100644 index 000000000..dd6d9c393 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_suffix_called_delete.sol @@ -0,0 +1,7 @@ +function delete(uint) pure suffix returns (uint) {} + +contract C { + uint x = 1 delete; +} +// ---- +// ParserError 2314: (9-15): Expected identifier but got 'delete' diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_suffix_called_hex.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_suffix_called_hex.sol new file mode 100644 index 000000000..ff8da62e2 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_suffix_called_hex.sol @@ -0,0 +1,7 @@ +function hex(bytes memory) pure suffix returns (bytes memory) {} + +contract C { + bytes b = hex"1234"hex; +} +// ---- +// ParserError 2314: (9-12): Expected identifier but got 'ILLEGAL' diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_suffix_called_hex_ambiguous.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_suffix_called_hex_ambiguous.sol new file mode 100644 index 000000000..9a154691a --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_suffix_called_hex_ambiguous.sol @@ -0,0 +1,7 @@ +function hex(uint) pure suffix returns (bytes memory) {} + +contract C { + bytes b = 1 hex"1234"; +} +// ---- +// ParserError 2314: (9-12): Expected identifier but got 'ILLEGAL' diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_suffix_called_new.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_suffix_called_new.sol new file mode 100644 index 000000000..60d64ace9 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_suffix_called_new.sol @@ -0,0 +1,7 @@ +function new(uint) pure suffix returns (uint) {} + +contract C { + uint x = 1 new; +} +// ---- +// ParserError 2314: (9-12): Expected identifier but got 'new' diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_suffix_called_unicode.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_suffix_called_unicode.sol new file mode 100644 index 000000000..08d8eeb61 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_suffix_called_unicode.sol @@ -0,0 +1,7 @@ +function unicode(string memory) pure suffix returns (string memory) {} + +contract C { + string s = unicode"😃"unicode; +} +// ---- +// ParserError 2314: (9-16): Expected identifier but got 'ILLEGAL' diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_super_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_super_as_suffix.sol new file mode 100644 index 000000000..c8d494cb1 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_super_as_suffix.sol @@ -0,0 +1,5 @@ +contract C { + uint a = 1000 super; +} +// ---- +// TypeError 6469: (26-36): Type cannot be used as a literal suffix. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_this_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_this_as_suffix.sol new file mode 100644 index 000000000..7c8e39da8 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_this_as_suffix.sol @@ -0,0 +1,5 @@ +contract C { + uint a = 1000 this; +} +// ---- +// TypeError 5704: (26-35): Contract cannot be used as a literal suffix. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_type_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_type_as_suffix.sol new file mode 100644 index 000000000..e31586291 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_type_as_suffix.sol @@ -0,0 +1,7 @@ +contract C { + function f() pure public { + (1 type).max; + } +} +// ---- +// ParserError 2314: (55-59): Expected ',' but got 'type' diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_virtual_function_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_virtual_function_as_suffix.sol new file mode 100644 index 000000000..af3909321 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/invalid_virtual_function_as_suffix.sol @@ -0,0 +1,11 @@ +abstract contract B { + function suffix(uint x) internal pure virtual returns (uint); +} + +contract C is B { + uint a = 1000 suffix; + + function suffix(uint x) internal pure override returns (uint) { return x; } +} +// ---- +// TypeError 4438: (127-133): The literal suffix must be either a subdenomination or a file-level suffix function. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/suffix_called_value_via_member_access.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/suffix_called_value_via_member_access.sol new file mode 100644 index 000000000..3f80f740b --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/suffix_called_value_via_member_access.sol @@ -0,0 +1,8 @@ +==== Source: A.sol ==== +function value(uint) pure suffix returns (uint) {} +==== Source: B.sol ==== +import "A.sol" as A; + +contract C { + uint x = 1000 A.value; +} diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/suffix_function_shadowing_builtin.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/suffix_function_shadowing_builtin.sol new file mode 100644 index 000000000..1bc62f014 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/suffix_function_shadowing_builtin.sol @@ -0,0 +1,3 @@ +function keccak256(bytes memory input) pure suffix returns (bytes32) {} +// ---- +// Warning 2319: (0-71): This declaration shadows a builtin symbol. diff --git a/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/unimplemented_function_as_suffix.sol b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/unimplemented_function_as_suffix.sol new file mode 100644 index 000000000..f81099790 --- /dev/null +++ b/test/libsolidity/syntaxTests/literalSuffixes/usableAsSuffix/unimplemented_function_as_suffix.sol @@ -0,0 +1,7 @@ +abstract contract B { + uint a = 1000 suffix; + + function suffix(uint x) internal pure virtual returns (uint); +} +// ---- +// TypeError 4438: (40-46): The literal suffix must be either a subdenomination or a file-level suffix function. diff --git a/test/libsolidity/syntaxTests/operators/userDefined/implementing_operator_with_literal_suffix_on_udvt_binary.sol b/test/libsolidity/syntaxTests/operators/userDefined/implementing_operator_with_literal_suffix_on_udvt_binary.sol new file mode 100644 index 000000000..7127c18e5 --- /dev/null +++ b/test/libsolidity/syntaxTests/operators/userDefined/implementing_operator_with_literal_suffix_on_udvt_binary.sol @@ -0,0 +1,8 @@ +type B is bool; +using {bitor as |} for B global; + +function bitor(B x, B y) pure suffix returns (B) { + return B.wrap(B.unwrap(x) || B.unwrap(y)); +} +// ---- +// TypeError 1587: (64-74): Literal suffix function has invalid parameter types. The mantissa parameter must be an integer. The exponent parameter must be an unsigned integer. diff --git a/test/libsolidity/syntaxTests/operators/userDefined/implementing_operator_with_literal_suffix_on_udvt_unary.sol b/test/libsolidity/syntaxTests/operators/userDefined/implementing_operator_with_literal_suffix_on_udvt_unary.sol new file mode 100644 index 000000000..44a6dd1fb --- /dev/null +++ b/test/libsolidity/syntaxTests/operators/userDefined/implementing_operator_with_literal_suffix_on_udvt_unary.sol @@ -0,0 +1,8 @@ +type Int is int; +using {unsub as -} for Int global; + +function unsub(Int x) pure suffix returns (Int) { + return Int.wrap(-Int.unwrap(x)); +} +// ---- +// TypeError 2998: (68-73): This literal suffix function is not usable as a suffix because no literal is implicitly convertible to its parameter type. diff --git a/test/libsolidity/syntaxTests/operators/userDefined/implementing_operator_with_literal_suffix_on_value_type.sol b/test/libsolidity/syntaxTests/operators/userDefined/implementing_operator_with_literal_suffix_on_value_type.sol new file mode 100644 index 000000000..14d6290be --- /dev/null +++ b/test/libsolidity/syntaxTests/operators/userDefined/implementing_operator_with_literal_suffix_on_value_type.sol @@ -0,0 +1,13 @@ +using {add as +, unsub as -} for uint global; + +function add(uint x, uint y) pure suffix returns (uint) { + return x + y; +} + +function unsub(uint x) pure suffix returns (uint) { + return uint(-int(x)); +} +// ---- +// TypeError 8841: (0-45): Can only use "global" with user-defined types. +// TypeError 5332: (7-10): Operators can only be implemented for user-defined value types. +// TypeError 5332: (17-22): Operators can only be implemented for user-defined value types.