From 1f69e63cfcc664fd7382dd877846007652a01dcf Mon Sep 17 00:00:00 2001 From: Ed Smith-Rowland <3dw4rd@verizon.net> Date: Tue, 2 Feb 2021 16:11:57 -0500 Subject: c++: Implement C++23 P0330 - Literal Suffixes for ptrdiff_t and size_t. Integer literal suffixes for signed size ('z') and unsigned size (some permutation od 'zu') are provided as a language addition. gcc/c-family/ChangeLog: * c-cppbuiltin.c (c_cpp_builtins): Define __cpp_size_t_suffix. * c-lex.c (interpret_integer): Set node type for size literal. libcpp/ChangeLog: * expr.c (interpret_int_suffix): Detect 'z' integer suffix. (cpp_classify_number): Compat warning for use of 'z' suffix. * include/cpplib.h (struct cpp_options): New flag. (enum cpp_warning_reason): New flag. (CPP_N_USERDEF): Comment C++0x -> C++11. (CPP_N_SIZE_T): New flag for cpp_classify_number. * init.c (cpp_set_lang): Initialize new flag. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/udlit-shadow-neg.C: Test for 'z' and 'zu' shadowing. * g++.dg/cpp23/feat-cxx2b.C: New test. * g++.dg/cpp23/size_t-literals.C: New test. * g++.dg/warn/Wsize_t-literals.C: New test. --- gcc/c-family/c-cppbuiltin.c | 5 + gcc/c-family/c-lex.c | 8 + gcc/testsuite/g++.dg/cpp0x/udlit-shadow-neg.C | 61 +++ gcc/testsuite/g++.dg/cpp23/feat-cxx2b.C | 549 ++++++++++++++++++++++++++ gcc/testsuite/g++.dg/cpp23/size_t-literals.C | 8 + gcc/testsuite/g++.dg/warn/Wsize_t-literals.C | 12 + 6 files changed, 643 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp23/feat-cxx2b.C create mode 100644 gcc/testsuite/g++.dg/cpp23/size_t-literals.C create mode 100644 gcc/testsuite/g++.dg/warn/Wsize_t-literals.C (limited to 'gcc') diff --git a/gcc/c-family/c-cppbuiltin.c b/gcc/c-family/c-cppbuiltin.c index dca6815..48dec21 100644 --- a/gcc/c-family/c-cppbuiltin.c +++ b/gcc/c-family/c-cppbuiltin.c @@ -1025,6 +1025,11 @@ c_cpp_builtins (cpp_reader *pfile) cpp_define (pfile, "__cpp_aggregate_paren_init=201902L"); cpp_define (pfile, "__cpp_using_enum=201907L"); } + if (cxx_dialect > cxx20) + { + /* Set feature test macros for C++23. */ + cpp_define (pfile, "__cpp_size_t_suffix=202006L"); + } if (flag_concepts) { if (cxx_dialect >= cxx20) diff --git a/gcc/c-family/c-lex.c b/gcc/c-family/c-lex.c index fe40a0f..6374b72 100644 --- a/gcc/c-family/c-lex.c +++ b/gcc/c-family/c-lex.c @@ -834,6 +834,14 @@ interpret_integer (const cpp_token *token, unsigned int flags, type = ((flags & CPP_N_UNSIGNED) ? widest_unsigned_literal_type_node : widest_integer_literal_type_node); + else if (flags & CPP_N_SIZE_T) + { + /* itk refers to fundamental types not aliased size types. */ + if (flags & CPP_N_UNSIGNED) + type = size_type_node; + else + type = signed_size_type_node; + } else { type = integer_types[itk]; diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-shadow-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-shadow-neg.C index fdddd8d..a30ec0f4 100644 --- a/gcc/testsuite/g++.dg/cpp0x/udlit-shadow-neg.C +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-shadow-neg.C @@ -17,6 +17,30 @@ unsigned long long int operator"" ull(unsigned long long int k) // { dg-warning "integer suffix|shadowed by implementation" } { return k; } +unsigned long long int +operator"" z(unsigned long long int k) // { dg-warning "integer suffix|shadowed by implementation" } +{ return k; } + +unsigned long long int +operator"" uz(unsigned long long int k) // { dg-warning "integer suffix|shadowed by implementation" } +{ return k; } + +unsigned long long int +operator"" zu(unsigned long long int k) // { dg-warning "integer suffix|shadowed by implementation" } +{ return k; } + +unsigned long long int +operator"" Z(unsigned long long int k) // { dg-warning "integer suffix|shadowed by implementation" } +{ return k; } + +unsigned long long int +operator"" UZ(unsigned long long int k) // { dg-warning "integer suffix|shadowed by implementation" } +{ return k; } + +unsigned long long int +operator"" ZU(unsigned long long int k) // { dg-warning "integer suffix|shadowed by implementation" } +{ return k; } + // Namespaces are no hiding place. namespace Long { @@ -37,13 +61,50 @@ unsigned long long int operator"" ull(unsigned long long int k) // { dg-warning "integer suffix|shadowed by implementation" } { return k; } +unsigned long long int +operator"" z(unsigned long long int k) // { dg-warning "integer suffix|shadowed by implementation" } +{ return k; } + +unsigned long long int +operator"" uz(unsigned long long int k) // { dg-warning "integer suffix|shadowed by implementation" } +{ return k; } + +unsigned long long int +operator"" zu(unsigned long long int k) // { dg-warning "integer suffix|shadowed by implementation" } +{ return k; } + +unsigned long long int +operator"" Z(unsigned long long int k) // { dg-warning "integer suffix|shadowed by implementation" } +{ return k; } + +unsigned long long int +operator"" UZ(unsigned long long int k) // { dg-warning "integer suffix|shadowed by implementation" } +{ return k; } + +unsigned long long int +operator"" ZU(unsigned long long int k) // { dg-warning "integer suffix|shadowed by implementation" } +{ return k; } + } // { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 5 } // { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 9 } // { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 13 } // { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 17 } +// { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 21 } // { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 25 } // { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 29 } // { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 33 } // { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 37 } +// { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 41 } + +// { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 49 } +// { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 53 } +// { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 57 } +// { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 61 } +// { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 65 } +// { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 69 } +// { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 73 } +// { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 77 } +// { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 81 } +// { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 85 } diff --git a/gcc/testsuite/g++.dg/cpp23/feat-cxx2b.C b/gcc/testsuite/g++.dg/cpp23/feat-cxx2b.C new file mode 100644 index 0000000..94e08a4 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp23/feat-cxx2b.C @@ -0,0 +1,549 @@ +// { dg-options "-std=c++2b -I${srcdir}/g++.dg/cpp1y -I${srcdir}/g++.dg/cpp1y/testinc" } + +// C++98 features: + +#ifndef __cpp_rtti +# error "__cpp_rtti" +#elif __cpp_rtti != 199711 +# error "__cpp_rtti != 199711" +#endif + +#ifndef __cpp_exceptions +# error "__cpp_exceptions" +#elif __cpp_exceptions != 199711 +# error "__cpp_exceptions != 199711" +#endif + +// C++11 features: + +#ifndef __cpp_raw_strings +# error "__cpp_raw_strings" +#elif __cpp_raw_strings != 200710 +# error "__cpp_raw_strings != 200710" +#endif + +#ifndef __cpp_unicode_literals +# error "__cpp_unicode_literals" +#elif __cpp_unicode_literals != 200710 +# error "__cpp_unicode_literals != 200710" +#endif + +#ifndef __cpp_user_defined_literals +# error "__cpp_user_defined_literals" +#elif __cpp_user_defined_literals != 200809 +# error "__cpp_user_defined_literals != 200809" +#endif + +#ifndef __cpp_lambdas +# error "__cpp_lambdas" +#elif __cpp_lambdas != 200907 +# error "__cpp_lambdas != 200907" +#endif + +#ifndef __cpp_range_based_for +# error "__cpp_range_based_for" +#elif __cpp_range_based_for != 201603 +# error "__cpp_range_based_for != 201603" +#endif + +#ifndef __cpp_decltype +# error "__cpp_decltype" +#elif __cpp_decltype != 200707 +# error "__cpp_decltype != 200707" +#endif + +#ifndef __cpp_attributes +# error "__cpp_attributes" +#elif __cpp_attributes != 200809 +# error "__cpp_attributes != 200809" +#endif + +#ifndef __cpp_rvalue_references +# error "__cpp_rvalue_references" +#elif __cpp_rvalue_references != 200610 +# error "__cpp_rvalue_references != 200610" +#endif + +#ifndef __cpp_variadic_templates +# error "__cpp_variadic_templates" +#elif __cpp_variadic_templates != 200704 +# error "__cpp_variadic_templates != 200704" +#endif + +#ifndef __cpp_initializer_lists +# error "__cpp_initializer_lists" +#elif __cpp_initializer_lists != 200806 +# error "__cpp_initializer_lists != 200806" +#endif + +#ifndef __cpp_delegating_constructors +# error "__cpp_delegating_constructors" +#elif __cpp_delegating_constructors != 200604 +# error "__cpp_delegating_constructors != 200604" +#endif + +#ifndef __cpp_nsdmi +# error "__cpp_nsdmi" +#elif __cpp_nsdmi != 200809 +# error "__cpp_nsdmi != 200809" +#endif + +#ifndef __cpp_inheriting_constructors +# error "__cpp_inheriting_constructors" +#elif __cpp_inheriting_constructors!= 201511 +# error "__cpp_inheriting_constructors != 201511" +#endif + +#ifndef __cpp_ref_qualifiers +# error "__cpp_ref_qualifiers" +#elif __cpp_ref_qualifiers != 200710 +# error "__cpp_ref_qualifiers != 200710" +#endif + +#ifndef __cpp_alias_templates +# error "__cpp_alias_templates" +#elif __cpp_alias_templates != 200704 +# error "__cpp_alias_templates != 200704" +#endif + +#ifndef __cpp_threadsafe_static_init +# error "__cpp_threadsafe_static_init" +#elif __cpp_threadsafe_static_init != 200806 +# error "__cpp_threadsafe_static_init != 200806" +#endif + +// C++14 features: + +#ifndef __cpp_binary_literals +# error "__cpp_binary_literals" +#elif __cpp_binary_literals != 201304 +# error "__cpp_binary_literals != 201304" +#endif + +#ifndef __cpp_init_captures +# error "__cpp_init_captures" +#elif __cpp_init_captures != 201803 +# error "__cpp_init_captures != 201803" +#endif + +#ifndef __cpp_generic_lambdas +# error "__cpp_generic_lambdas" +#elif __cpp_generic_lambdas != 201707 +# error "__cpp_generic_lambdas != 201707" +#endif + +#ifndef __cpp_constexpr +# error "__cpp_constexpr" +#elif __cpp_constexpr != 201907 +# error "__cpp_constexpr != 201907" +#endif + +#ifndef __cpp_decltype_auto +# error "__cpp_decltype_auto" +#elif __cpp_decltype_auto != 201304 +# error "__cpp_decltype_auto != 201304" +#endif + +#ifndef __cpp_return_type_deduction +# error "__cpp_return_type_deduction" +#elif __cpp_return_type_deduction != 201304 +# error "__cpp_return_type_deduction != 201304" +#endif + +#ifndef __cpp_aggregate_nsdmi +# error "__cpp_aggregate_nsdmi" +#elif __cpp_aggregate_nsdmi != 201304 +# error "__cpp_aggregate_nsdmi != 201304" +#endif + +#ifndef __cpp_variable_templates +# error "__cpp_variable_templates" +#elif __cpp_variable_templates != 201304 +# error "__cpp_variable_templates != 201304" +#endif + +#ifndef __cpp_digit_separators +# error "__cpp_digit_separators" +#elif __cpp_digit_separators != 201309 +# error "__cpp_digit_separators != 201309" +#endif + +#ifndef __cpp_sized_deallocation +# error "__cpp_sized_deallocation" +#elif __cpp_sized_deallocation != 201309 +# error "__cpp_sized_deallocation != 201309" +#endif + +// GNU VLA support: + +#ifndef __cpp_runtime_arrays +# error "__cpp_runtime_arrays" +#elif __cpp_runtime_arrays != 198712 +# error "__cpp_runtime_arrays != 198712" +#endif + +// C++11 attributes: + +#ifdef __has_cpp_attribute +# if ! __has_cpp_attribute(noreturn) +# error "__has_cpp_attribute(noreturn)" +# elif __has_cpp_attribute(noreturn) != 200809 +# error "__has_cpp_attribute(noreturn) != 200809" +# endif +#else +# error "__has_cpp_attribute" +#endif + +// Attribute carries_dependency not in yet. +//#ifdef __has_cpp_attribute +//# if ! __has_cpp_attribute(carries_dependency) +//# error "__has_cpp_attribute(carries_dependency)" +//# elif __has_cpp_attribute(carries_dependency) != 200809 +//# error "__has_cpp_attribute(carries_dependency) != 200809" +//# endif +//#else +//# error "__has_cpp_attribute" +//#endif + +// C++14 attributes: + +#ifdef __has_cpp_attribute +# if ! __has_cpp_attribute(deprecated) +# error "__has_cpp_attribute(deprecated)" +# elif __has_cpp_attribute(deprecated) != 201309 +# error "__has_cpp_attribute(deprecated) != 201309" +# endif +#else +# error "__has_cpp_attribute" +#endif + +// Include checks: + +// Check for __has_include macro. +#ifndef __has_include +# error "__has_include" +#endif + +// Try known bracket header (use operator). +#if __has_include () +#else +# error "" +#endif + +// Define and use a macro to invoke the operator. +#define sluggo(TXT) __has_include(TXT) + +#if sluggo() +#else +# error "" +#endif + +#if ! sluggo() +# error "" +#else +#endif + +// Quoted complex.h should find at least the bracket version. +#if __has_include("complex.h") +#else +# error "complex.h" +#endif + +// Try known local quote header. +#if __has_include("complex_literals.h") +#else +# error "\"complex_literals.h\"" +#endif + +// Try nonexistent bracket header. +#if __has_include() +# error "" +#else +#endif + +// Try nonexistent quote header. +#if __has_include("phlegm") +# error "\"phlegm\"" +#else +#endif + +// Test __has_include_next. +#if __has_include("phoobhar.h") +# include "phoobhar.h" +#else +# error "__has_include(\"phoobhar.h\")" +#endif + +// Try a macro. +#define COMPLEX_INC "complex.h" +#if __has_include(COMPLEX_INC) +#else +# error COMPLEX_INC +#endif + +// Realistic use of __has_include. +#if __has_include() +# define STD_ARRAY 1 +# include + template + using array = std::array<_Tp, _Num>; +#elif __has_include() +# define TR1_ARRAY 1 +# include + template + typedef std::tr1::array<_Tp, _Num> array; +#endif + +// C++17 features: + +#ifndef __cpp_unicode_characters +# error "__cpp_unicode_characters" +#elif __cpp_unicode_characters != 201411 +# error "__cpp_unicode_characters != 201411" +#endif + +#ifndef __cpp_static_assert +# error "__cpp_static_assert" +#elif __cpp_static_assert != 201411 +# error "__cpp_static_assert != 201411" +#endif + +#ifndef __cpp_namespace_attributes +# error "__cpp_namespace_attributes" +#elif __cpp_namespace_attributes != 201411 +# error "__cpp_namespace_attributes != 201411" +#endif + +#ifndef __cpp_enumerator_attributes +# error "__cpp_enumerator_attributes" +#elif __cpp_enumerator_attributes != 201411 +# error "__cpp_enumerator_attributes != 201411" +#endif + +#ifndef __cpp_nested_namespace_definitions +# error "__cpp_nested_namespace_definitions" +#elif __cpp_nested_namespace_definitions != 201411 +# error "__cpp_nested_namespace_definitions != 201411" +#endif + +#ifndef __cpp_fold_expressions +# error "__cpp_fold_expressions" +#elif __cpp_fold_expressions != 201603 +# error "__cpp_fold_expressions != 201603" +#endif + +#ifndef __cpp_nontype_template_args +# error "__cpp_nontype_template_args" +#elif __cpp_nontype_template_args != 201911 +# error "__cpp_nontype_template_args != 201911" +#endif + +#ifndef __cpp_hex_float +# error "__cpp_hex_float" +#elif __cpp_hex_float != 201603 +# error "__cpp_hex_float != 201603" +#endif + +#ifndef __cpp_aggregate_bases +# error "__cpp_aggregate_bases" +#elif __cpp_aggregate_bases != 201603 +# error "__cpp_aggregate_bases != 201603" +#endif + +#ifndef __cpp_deduction_guides +# error "__cpp_deduction_guides" +#elif __cpp_deduction_guides != 201907 +# error "__cpp_deduction_guides != 201907" +#endif + +#ifndef __cpp_if_constexpr +# error "__cpp_if_constexpr" +#elif __cpp_if_constexpr != 201606 +# error "__cpp_if_constexpr != 201606" +#endif + +#ifndef __cpp_aligned_new +# error "__cpp_aligned_new" +#elif __cpp_aligned_new != 201606 +# error "__cpp_aligned_new != 201606" +#endif + +#ifndef __cpp_template_auto +# error "__cpp_template_auto" +#elif __cpp_template_auto != 201606 +# error "__cpp_template_auto != 201606" +#endif + +#ifndef __cpp_inline_variables +# error "__cpp_inline_variables" +#elif __cpp_inline_variables != 201606 +# error "__cpp_inline_variables != 201606" +#endif + +#ifndef __cpp_capture_star_this +# error "__cpp_capture_star_this" +#elif __cpp_capture_star_this != 201603 +# error "__cpp_capture_star_this != 201603" +#endif + +#ifndef __cpp_noexcept_function_type +# error "__cpp_noexcept_function_type" +#elif __cpp_noexcept_function_type != 201510 +# error "__cpp_noexcept_function_type != 201510" +#endif + +#ifndef __cpp_structured_bindings +# error "__cpp_structured_bindings" +#elif __cpp_structured_bindings != 201606 +# error "__cpp_structured_bindings != 201606" +#endif + +#ifndef __cpp_template_template_args +# error "__cpp_template_template_args" +#elif __cpp_template_template_args != 201611 +# error "__cpp_template_template_args != 201611" +#endif + +#ifndef __cpp_variadic_using +# error "__cpp_variadic_using" +#elif __cpp_variadic_using != 201611 +# error "__cpp_variadic_using != 201611" +#endif + +#ifndef __cpp_guaranteed_copy_elision +# error "__cpp_guaranteed_copy_elision" +#elif __cpp_guaranteed_copy_elision != 201606 +# error "__cpp_guaranteed_copy_elision != 201606" +#endif + +#ifndef __cpp_nontype_template_parameter_auto +# error "__cpp_nontype_template_parameter_auto" +#elif __cpp_nontype_template_parameter_auto != 201606 +# error "__cpp_nontype_template_parameter_auto != 201606" +#endif + +// C++20 features + +#ifndef __cpp_conditional_explicit +# error "__cpp_conditional_explicit" +#elif __cpp_conditional_explicit != 201806 +# error "__cpp_conditional_explicit != 201806" +#endif + +#ifndef __cpp_nontype_template_parameter_class +# error "__cpp_nontype_template_parameter_class" +#elif __cpp_nontype_template_parameter_class != 201806 +# error "__cpp_nontype_template_parameter_class != 201806" +#endif + +#ifndef __cpp_impl_destroying_delete +# error "__cpp_impl_destroying_delete" +#elif __cpp_impl_destroying_delete != 201806 +# error "__cpp_impl_destroying_delete != 201806" +#endif + +#ifndef __cpp_constinit +# error "__cpp_constinit" +#elif __cpp_constinit != 201907 +# error "__cpp_constinit != 201907" +#endif + +#ifndef __cpp_constexpr_dynamic_alloc +# error "__cpp_constexpr_dynamic_alloc" +#elif __cpp_constexpr_dynamic_alloc != 201907 +# error "__cpp_constexpr_dynamic_alloc != 201907" +#endif + +#ifndef __cpp_aggregate_paren_init +# error "__cpp_aggregate_paren_init" +#elif __cpp_aggregate_paren_init != 201902 +# error "__cpp_aggregate_paren_init != 201902" +#endif + +#ifdef __has_cpp_attribute + +# if ! __has_cpp_attribute(maybe_unused) +# error "__has_cpp_attribute(maybe_unused)" +# elif __has_cpp_attribute(maybe_unused) != 201603 +# error "__has_cpp_attribute(maybe_unused) != 201603" +# endif + +# if ! __has_cpp_attribute(nodiscard) +# error "__has_cpp_attribute(nodiscard)" +# elif __has_cpp_attribute(nodiscard) != 201907 +# error "__has_cpp_attribute(nodiscard) != 201907" +# endif + +# if ! __has_cpp_attribute(fallthrough) +# error "__has_cpp_attribute(fallthrough)" +# elif __has_cpp_attribute(fallthrough) != 201603 +# error "__has_cpp_attribute(fallthrough) != 201603" +# endif + +# if ! __has_cpp_attribute(no_unique_address) +# error "__has_cpp_attribute(no_unique_address)" +# elif __has_cpp_attribute(no_unique_address) != 201803 +# error "__has_cpp_attribute(no_unique_address) != 201803" +# endif + +# if ! __has_cpp_attribute(likely) +# error "__has_cpp_attribute(likely)" +# elif __has_cpp_attribute(likely) != 201803 +# error "__has_cpp_attribute(likely) != 201803" +# endif + +# if ! __has_cpp_attribute(unlikely) +# error "__has_cpp_attribute(unlikely)" +# elif __has_cpp_attribute(unlikely) != 201803 +# error "__has_cpp_attribute(unlikely) != 201803" +# endif + +#else +# error "__has_cpp_attribute" +#endif + +#ifndef __cpp_char8_t +# error "__cpp_char8_t" +#elif __cpp_char8_t != 201811 +# error "__cpp_char8_t != 201811" +#endif + +#ifndef __cpp_designated_initializers +# error "__cpp_designated_initializers" +#elif __cpp_designated_initializers != 201707 +# error "__cpp_designated_initializers != 201707" +#endif + +#ifndef __cpp_constexpr_in_decltype +# error "__cpp_constexpr_in_decltype" +#elif __cpp_constexpr_in_decltype != 201711 +# error "__cpp_constexpr_in_decltype != 201711" +#endif + +/* Not supported fully yet: +#ifndef __cpp_consteval +# error "__cpp_consteval" +#elif __cpp_consteval != 201811 +# error "__cpp_consteval != 201811" +#endif +*/ + +#ifndef __cpp_concepts +# error "__cpp_concepts" +#elif __cpp_concepts != 201907 +# error "__cpp_concepts != 201907" +#endif + +#ifndef __cpp_using_enum +# error "__cpp_using_enum" +#elif __cpp_using_enum != 201907 +# error "__cpp_using_enum != 201907" +#endif + +// C++23 features: + +#ifndef __cpp_size_t_suffix +# error "__cpp_size_t_suffix" +#elif __cpp_size_t_suffix != 202006 +# error "__cpp_size_t_suffix != 202006" +#endif diff --git a/gcc/testsuite/g++.dg/cpp23/size_t-literals.C b/gcc/testsuite/g++.dg/cpp23/size_t-literals.C new file mode 100644 index 0000000..3488032 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp23/size_t-literals.C @@ -0,0 +1,8 @@ +// { dg-do compile { target c++23 } } + +#include +#include + +static_assert(std::is_same_v); +static_assert(std::is_same_v>); + diff --git a/gcc/testsuite/g++.dg/warn/Wsize_t-literals.C b/gcc/testsuite/g++.dg/warn/Wsize_t-literals.C new file mode 100644 index 0000000..dc0025b --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wsize_t-literals.C @@ -0,0 +1,12 @@ +// { dg-do compile { target c++11 } } + +#include +#include + +std::size_t s1 = 1234zu; // { dg-warning {use of C\+\+23 .size_t. integer constant} "" { target c++20_down } } +std::size_t S1 = 5678ZU; // { dg-warning {use of C\+\+23 .size_t. integer constant} "" { target c++20_down } } +std::size_t s2 = 1234uz; // { dg-warning {use of C\+\+23 .size_t. integer constant} "" { target c++20_down } } +std::size_t S2 = 5678UZ; // { dg-warning {use of C\+\+23 .size_t. integer constant} "" { target c++20_down } } + +std::make_signed::type pd1 = 1234z; // { dg-warning {use of C\+\+23 .make_signed::type. integer constant} "" { target c++20_down } } +std::make_signed::type PD1 = 5678Z; // { dg-warning {use of C\+\+23 .make_signed::type. integer constant} "" { target c++20_down } } -- cgit v1.1 From 5c3d388aee5609d32bd8e3ba1add776b1a6f0d1f Mon Sep 17 00:00:00 2001 From: Martin Sebor Date: Wed, 3 Feb 2021 10:23:06 -0700 Subject: PR tree-optimization/98937 - pointer_query cache leaks gcc/ChangeLog: PR tree-optimization/98937 * tree-ssa-strlen.c (strlen_dom_walker::~strlen_dom_walker): Define. Flush pointer_query cache. --- gcc/tree-ssa-strlen.c | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'gcc') diff --git a/gcc/tree-ssa-strlen.c b/gcc/tree-ssa-strlen.c index c6f7405..8912a11 100644 --- a/gcc/tree-ssa-strlen.c +++ b/gcc/tree-ssa-strlen.c @@ -5491,6 +5491,8 @@ public: m_cleanup_cfg (false) { } + ~strlen_dom_walker (); + virtual edge before_dom_children (basic_block); virtual void after_dom_children (basic_block); @@ -5508,6 +5510,13 @@ public: bool m_cleanup_cfg; }; +/* Release pointer_query cache. */ + +strlen_dom_walker::~strlen_dom_walker () +{ + ptr_qry.flush_cache (); +} + /* Callback for walk_dominator_tree. Attempt to optimize various string ops by remembering string lengths pointed by pointer SSA_NAMEs. */ -- cgit v1.1 From 5c62e4f255bfac65e18213fd93ee1c9908b4a750 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 3 Feb 2021 00:29:00 -0500 Subject: c++: Fix alias comparison [PR98926] The comparison of dependent aliases wasn't working here because processing_template_decl wasn't set, so dependent_alias_template_spec_p was always returning false. gcc/cp/ChangeLog: PR c++/98926 PR c++/98570 * pt.c (spec_hasher::equal): Set processing_template_decl. * Make-lang.in (check-g++-strict-gc): Add --param hash-table-verification-limit=10000. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/alias-decl-dr1558.C: Pass --param hash-table-verification-limit=10000. --- gcc/cp/Make-lang.in | 2 +- gcc/cp/pt.c | 2 ++ gcc/testsuite/g++.dg/cpp0x/alias-decl-dr1558.C | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) (limited to 'gcc') diff --git a/gcc/cp/Make-lang.in b/gcc/cp/Make-lang.in index 62295fb..155be74 100644 --- a/gcc/cp/Make-lang.in +++ b/gcc/cp/Make-lang.in @@ -224,7 +224,7 @@ check-c++-all: # Run the testsuite with garbage collection at every opportunity. check-g++-strict-gc: - $(MAKE) RUNTESTFLAGS="$(RUNTESTFLAGS) --extra_opts,--param,ggc-min-heapsize=0,--param,ggc-min-expand=0" \ + $(MAKE) RUNTESTFLAGS="$(RUNTESTFLAGS) --extra_opts,--param,ggc-min-heapsize=0,--param,ggc-min-expand=0,--param,hash-table-verification-limit=10000" \ TESTSUITEDIR="$(TESTSUITEDIR).gc" check-g++ check-c++-subtargets : check-g++-subtargets # List of targets that can use the generic check- rule and its // variant. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 4781519..c5b0a92 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -1720,6 +1720,7 @@ spec_hasher::equal (spec_entry *e1, spec_entry *e2) ++comparing_specializations; ++comparing_dependent_aliases; + ++processing_template_decl; equal = (e1->tmpl == e2->tmpl && comp_template_args (e1->args, e2->args)); if (equal && flag_concepts @@ -1734,6 +1735,7 @@ spec_hasher::equal (spec_entry *e1, spec_entry *e2) tree c2 = e2->spec ? get_constraints (e2->spec) : NULL_TREE; equal = equivalent_constraints (c1, c2); } + --processing_template_decl; --comparing_dependent_aliases; --comparing_specializations; diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-dr1558.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-dr1558.C index 2bbb138..8495462 100644 --- a/gcc/testsuite/g++.dg/cpp0x/alias-decl-dr1558.C +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-dr1558.C @@ -1,5 +1,6 @@ // DR 1558 still applies when using void_t as a template-argument. // { dg-do compile { target c++11 } } +// { dg-additional-options "--param hash-table-verification-limit=10000" } template using void_t = void; template struct A { }; -- cgit v1.1 From b52a1dfe12a6303c7649f3ff5b8dac6c1001d49a Mon Sep 17 00:00:00 2001 From: Marek Polacek Date: Wed, 3 Feb 2021 11:58:13 -0500 Subject: c++: Mark member functions as const [PR98951] These member functions look like they could be marked const, since they don't modify any (non-mutable) class members. PR c++/98951 * call.c (struct z_candidate): Mark rewritten and reversed as const. (struct NonPublicField): Mark operator() as const. (struct NonTrivialField): Likewise. --- gcc/cp/call.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'gcc') diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 87a7af1..3068c0f 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -520,8 +520,8 @@ struct z_candidate { /* The flags active in add_candidate. */ int flags; - bool rewritten () { return (flags & LOOKUP_REWRITTEN); } - bool reversed () { return (flags & LOOKUP_REVERSED); } + bool rewritten () const { return (flags & LOOKUP_REWRITTEN); } + bool reversed () const { return (flags & LOOKUP_REVERSED); } }; /* Returns true iff T is a null pointer constant in the sense of @@ -9474,7 +9474,7 @@ first_non_static_field (tree type, Predicate pred) struct NonPublicField { - bool operator() (const_tree t) + bool operator() (const_tree t) const { return DECL_P (t) && (TREE_PRIVATE (t) || TREE_PROTECTED (t)); } @@ -9491,7 +9491,7 @@ first_non_public_field (tree type) struct NonTrivialField { - bool operator() (const_tree t) + bool operator() (const_tree t) const { return !trivial_type_p (DECL_P (t) ? TREE_TYPE (t) : t); } -- cgit v1.1 From 34215a7a3a359d700a520f1d5bdaec835f0b5180 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Wed, 3 Feb 2021 15:01:19 -0700 Subject: Fix typo in Fortran manual gcc/fortran: * intrinsic.texi (ANINT): Fix typo. --- gcc/fortran/intrinsic.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gcc') diff --git a/gcc/fortran/intrinsic.texi b/gcc/fortran/intrinsic.texi index 5debe94..63416bc 100644 --- a/gcc/fortran/intrinsic.texi +++ b/gcc/fortran/intrinsic.texi @@ -1232,7 +1232,7 @@ end program test_anint @item @emph{Specific names}: @multitable @columnfractions .20 .20 .20 .25 @item Name @tab Argument @tab Return type @tab Standard -@item @code{AINT(A)} @tab @code{REAL(4) A} @tab @code{REAL(4)} @tab Fortran 77 and later +@item @code{ANINT(A)} @tab @code{REAL(4) A} @tab @code{REAL(4)} @tab Fortran 77 and later @item @code{DNINT(A)} @tab @code{REAL(8) A} @tab @code{REAL(8)} @tab Fortran 77 and later @end multitable @end table -- cgit v1.1 From ac16f4327fef5dfc288409371a61649253353ef7 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 3 Feb 2021 23:18:05 +0100 Subject: libcpp: Fix up -fdirectives-only preprocessing [PR98882] GCC 11 ICEs on all -fdirectives-only preprocessing when the files don't end with a newline. The problem is in the assertion, for empty TUs buffer->cur == buffer->rlimit and so buffer->rlimit[-1] access triggers UB in the preprocessor, for non-empty TUs it refers to the last character in the file, which can be anything. The preprocessor adds a '\n' character (or '\r', in particular if the user file ends with '\r' then it adds another '\r' rather than '\n'), but that is added after the limit, i.e. at buffer->rlimit[0]. Now, if the routine handles occassional bumping of pos to buffer->rlimit + 1, I think it is just the assert that needs changing, usually we read from *pos if pos < limit and then e.g. if it is '\r', look at the following character (which could be one of those '\n' or '\r' at buffer->rlimit[0]). There is also the case where for '\\' before the limit we read following character and if it is '\n', do one thing, if it is '\r' read another character. But in that case if '\\' was the last char in the TU, the limit char will be '\n', so we are ok. 2021-02-03 Jakub Jelinek PR preprocessor/98882 * lex.c (cpp_directive_only_process): Don't assert that rlimit[-1] is a newline, instead assert that rlimit[0] is either newline or carriage return. When seeing '\\' followed by '\r', check limit before accessing pos[1]. * gcc.dg/cpp/pr98882.c: New test. --- gcc/testsuite/gcc.dg/cpp/pr98882.c | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/cpp/pr98882.c (limited to 'gcc') diff --git a/gcc/testsuite/gcc.dg/cpp/pr98882.c b/gcc/testsuite/gcc.dg/cpp/pr98882.c new file mode 100644 index 0000000..e831df0 --- /dev/null +++ b/gcc/testsuite/gcc.dg/cpp/pr98882.c @@ -0,0 +1,6 @@ +/* PR preprocessor/98882 */ +/* { dg-do preprocess } */ +/* { dg-options "-fdirectives-only" } */ + +/* Last line does not end with a newline. */ + /*Here*/ \ No newline at end of file -- cgit v1.1 From 9faaa80776a3dd602b47555bc001ca9a6ac6b784 Mon Sep 17 00:00:00 2001 From: GCC Administrator Date: Thu, 4 Feb 2021 00:16:32 +0000 Subject: Daily bump. --- gcc/ChangeLog | 157 ++++++++++++++++++++++++++++++++++++++++++++++++ gcc/DATESTAMP | 2 +- gcc/ada/ChangeLog | 18 ++++++ gcc/c-family/ChangeLog | 5 ++ gcc/cp/ChangeLog | 26 ++++++++ gcc/fortran/ChangeLog | 10 +++ gcc/testsuite/ChangeLog | 53 ++++++++++++++++ 7 files changed, 270 insertions(+), 1 deletion(-) (limited to 'gcc') diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fc67dd4..388681f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,160 @@ +2021-02-03 Martin Sebor + + PR tree-optimization/98937 + * tree-ssa-strlen.c (strlen_dom_walker::~strlen_dom_walker): Define. + Flush pointer_query cache. + +2021-02-03 Aaron Sawdey + + * config/rs6000/genfusion.pl (gen_2logical): Add missing + fixes based on patch review. + * config/rs6000/fusion.md: Regenerate file. + +2021-02-03 Aaron Sawdey + + * config/rs6000/t-rs6000: Comment out auto generation of + fusion.md for now. + +2021-02-03 Andrew Stubbs + + * config/gcn/gcn-opts.h (enum processor_type): Add PROCESSOR_GFX908. + * config/gcn/gcn.c (gcn_omp_device_kind_arch_isa): Add gfx908. + (output_file_start): Add gfx908. + * config/gcn/gcn.opt (gpu_type): Add gfx908. + * config/gcn/t-gcn-hsa (MULTILIB_OPTIONS): Add march=gfx908. + (MULTILIB_DIRNAMES): Add gfx908. + * config/gcn/mkoffload.c (EF_AMDGPU_MACH_AMDGCN_GFX908): New define. + (main): Recognize gfx908. + * config/gcn/t-omp-device: Add gfx908. + +2021-02-03 Jonathan Wright + + * config/aarch64/aarch64-simd-builtins.def: Add + [su]mlsl_hi_lane[q] builtin macro generators. + * config/aarch64/aarch64-simd.md + (aarch64_mlsl_hi_lane_insn): Define. + (aarch64_mlsl_hi_lane): Define. + (aarch64_mlsl_hi_laneq_insn): Define. + (aarch64_mlsl_hi_laneq): Define. + * config/aarch64/arm_neon.h (vmlsl_high_lane_s16): Use RTL + builtin instead of inline asm. + (vmlsl_high_lane_s32): Likewise. + (vmlsl_high_lane_u16): Likewise. + (vmlsl_high_lane_u32): Likewise. + (vmlsl_high_laneq_s16): Likewise. + (vmlsl_high_laneq_s32): Likewise. + (vmlsl_high_laneq_u16): Likewise. + (vmlsl_high_laneq_u32): Likewise. + (vmlal_high_laneq_u32): Likewise. + +2021-02-03 Jonathan Wright + + * config/aarch64/aarch64-simd-builtins.def: Add + [su]mlal_hi_lane[q] builtin generator macros. + * config/aarch64/aarch64-simd.md + (aarch64_mlal_hi_lane_insn): Define. + (aarch64_mlal_hi_lane): Define. + (aarch64_mlal_hi_laneq_insn): Define. + (aarch64_mlal_hi_laneq): Define. + * config/aarch64/arm_neon.h (vmlal_high_lane_s16): Use RTL + builtin instead of inline asm. + (vmlal_high_lane_s32): Likewise. + (vmlal_high_lane_u16): Likewise. + (vmlal_high_lane_u32): Likewise. + (vmlal_high_laneq_s16): Likewise. + (vmlal_high_laneq_s32): Likewise. + (vmlal_high_laneq_u16): Likewise. + (vmlal_high_laneq_u32): Likewise. + +2021-02-03 Jonathan Wright + + * config/aarch64/aarch64-simd-builtins.def: Add [su]mlsl_hi_n + builtin generator macros. + * config/aarch64/aarch64-simd.md (aarch64_mlsl_hi_n_insn): + Define. + (aarch64_mlsl_hi_n): Define. + * config/aarch64/arm_neon.h (vmlsl_high_n_s16): Use RTL builtin + instead of inline asm. + (vmlsl_high_n_s32): Likewise. + (vmlsl_high_n_u16): Likewise. + (vmlsl_high_n_u32): Likewise. + +2021-02-03 Jonathan Wright + + * config/aarch64/aarch64-simd-builtins.def: Add [su]mlal_hi_n + builtin generator macros. + * config/aarch64/aarch64-simd.md (aarch64_mlal_hi_n_insn): + Define. + (aarch64_mlal_hi_n): Define. + * config/aarch64/arm_neon.h (vmlal_high_n_s16): Use RTL builtin + instead of inline asm. + (vmlal_high_n_s32): Likewise. + (vmlal_high_n_u16): Likewise. + (vmlal_high_n_u32): Likewise. + +2021-02-03 Jonathan Wright + + * config/aarch64/aarch64-simd-builtins.def: Add RTL builtin + generator macros. + * config/aarch64/aarch64-simd.md (*aarch64_mlal_hi): + Rename to... + (aarch64_mlal_hi_insn): This. + (aarch64_mlal_hi): Define. + * config/aarch64/arm_neon.h (vmlal_high_s8): Use RTL builtin + instead of inline asm. + (vmlal_high_s16): Likewise. + (vmlal_high_s32): Likewise. + (vmlal_high_u8): Likewise. + (vmlal_high_u16): Likewise. + (vmlal_high_u32): Likewise. + +2021-02-03 Ilya Leoshkevich + + * lra-spills.c (remove_pseudos): Call lra_update_insn_recog_data() + after calling alter_subreg() on a (mem). + +2021-02-03 Martin Liska + + PR lto/98912 + * lto-streamer-out.c (produce_lto_section): Fill up missing + padding. + * lto-streamer.h (struct lto_section): Add _padding field. + +2021-02-03 Richard Biener + + * lto-streamer.c (lto_get_section_name): Free temporary + buffer. + * tree-loop-distribution.c + (loop_distribution::merge_dep_scc_partitions): Free edge data. + +2021-02-03 Jakub Jelinek + + PR middle-end/97487 + * ifcvt.c (noce_can_force_operand): New function. + (noce_emit_move_insn): Use it. + (noce_try_sign_mask): Likewise. Formatting fix. + +2021-02-03 Jakub Jelinek + + PR middle-end/97971 + * lra-constraints.c (process_alt_operands): For inline asm, don't call + fatal_insn, but instead return false. + +2021-02-03 Jakub Jelinek + + PR tree-optimization/98287 + * config/i386/mmx.md (3): For shifts don't enable expander + for V1DImode. + +2021-02-03 Tamar Christina + + PR tree-optimization/98928 + * tree-vect-loop.c (vect_analyze_loop_2): Change + STMT_VINFO_SLP_VECT_ONLY to STMT_VINFO_SLP_VECT_ONLY_PATTERN. + * tree-vect-slp-patterns.c (complex_pattern::build): Likewise. + * tree-vectorizer.h (STMT_VINFO_SLP_VECT_ONLY_PATTERN): New. + (class _stmt_vec_info): Add slp_vect_pattern_only_p. + 2021-02-02 Richard Biener * gimple-loop-interchange.cc (prepare_data_references): diff --git a/gcc/DATESTAMP b/gcc/DATESTAMP index 465eb04..8aed06e 100644 --- a/gcc/DATESTAMP +++ b/gcc/DATESTAMP @@ -1 +1 @@ -20210203 +20210204 diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 75f75ec..4397355 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,21 @@ +2021-02-03 Eric Botcazou + + * gcc-interface/decl.c (components_to_record): If the first component + with rep clause is the _Parent field with variable size, temporarily + set it aside when computing the internal layout of the REP part again. + * gcc-interface/utils.c (finish_record_type): Revert to taking the + maximum when merging sizes for all record types with rep clause. + (merge_sizes): Put SPECIAL parameter last and adjust recursive calls. + +2021-02-03 Eric Botcazou + + * gcc-interface/decl.c (gnat_to_gnu_entity) : Make the + two fields of the fat pointer type addressable, and do not make the + template type read-only. + : If the type has discriminants mark it as may_alias. + * gcc-interface/utils.c (make_dummy_type): Likewise. + (build_dummy_unc_pointer_types): Likewise. + 2021-01-26 Marius Hillenbrand PR ada/98228 diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index fa67d1a..0369b70 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,8 @@ +2021-02-03 Ed Smith-Rowland <3dw4rd@verizon.net> + + * c-cppbuiltin.c (c_cpp_builtins): Define __cpp_size_t_suffix. + * c-lex.c (interpret_integer): Set node type for size literal. + 2021-01-28 Jakub Jelinek * c.opt (-std=c++2a, -std=c++20, -std=gnu++2a, -std=gnu++20): Remove diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index de69476..2804cd1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,29 @@ +2021-02-03 Marek Polacek + + PR c++/98951 + * call.c (struct z_candidate): Mark rewritten and reversed as const. + (struct NonPublicField): Mark operator() as const. + (struct NonTrivialField): Likewise. + +2021-02-03 Jason Merrill + + PR c++/98926 + PR c++/98570 + * pt.c (spec_hasher::equal): Set processing_template_decl. + * Make-lang.in (check-g++-strict-gc): Add --param + hash-table-verification-limit=10000. + +2021-02-03 Marek Polacek + + PR c++/98899 + * parser.c (cp_parser_class_specifier_1): Use any possible + DEFPARSE_INSTANTIATIONS to update DEFERRED_NOEXCEPT_PATTERN. + (cp_parser_save_noexcept): Initialize DEFPARSE_INSTANTIATIONS. + * pt.c (tsubst_exception_specification): Stash new_specs into + DEFPARSE_INSTANTIATIONS. + * tree.c (fixup_deferred_exception_variants): Use + UNPARSED_NOEXCEPT_SPEC_P. + 2021-02-02 Jason Merrill PR c++/98929 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 5602503..9f75bb7 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,13 @@ +2021-02-03 Jeff Law + + * intrinsic.texi (ANINT): Fix typo. + +2021-02-03 Tobias Burnus + + PR fortran/98913 + * dependency.c (gfc_dep_resolver): Treat local access + to coarrays like any array access in dependency analysis. + 2021-01-28 Harald Anlauf PR fortran/86470 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a0c6e73..4163d76 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,56 @@ +2021-02-03 Jakub Jelinek + + PR preprocessor/98882 + * gcc.dg/cpp/pr98882.c: New test. + +2021-02-03 Jason Merrill + + * g++.dg/cpp0x/alias-decl-dr1558.C: Pass --param + hash-table-verification-limit=10000. + +2021-02-03 Ed Smith-Rowland <3dw4rd@verizon.net> + + * g++.dg/cpp0x/udlit-shadow-neg.C: Test for 'z' and 'zu' shadowing. + * g++.dg/cpp23/feat-cxx2b.C: New test. + * g++.dg/cpp23/size_t-literals.C: New test. + * g++.dg/warn/Wsize_t-literals.C: New test. + +2021-02-03 Jakub Jelinek + + PR c++/97804 + * g++.dg/cpp2a/no_unique_address11.C: New test. + +2021-02-03 Marek Polacek + + PR c++/98899 + * g++.dg/cpp0x/noexcept65.C: New test. + +2021-02-03 Tobias Burnus + + PR fortran/98913 + * gfortran.dg/coarray/array_temporary.f90: New test. + +2021-02-03 Jakub Jelinek + + PR middle-end/97487 + * gcc.dg/pr97487-1.c: New test. + * gcc.dg/pr97487-2.c: New test. + +2021-02-03 Jakub Jelinek + + PR middle-end/97971 + * gcc.target/i386/pr97971.c: New test. + +2021-02-03 Jakub Jelinek + + PR tree-optimization/98287 + * gcc.dg/pr98287.c: New test. + +2021-02-03 Tamar Christina + + PR tree-optimization/98928 + * gcc.target/i386/pr98928.c: New test. + 2021-02-02 Martin Liska PR target/97510 -- cgit v1.1 From 7b258ac7afaaf7d8157df10ea35c6002d935d7d0 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Mon, 1 Feb 2021 17:24:05 -0500 Subject: c++: subst failure in attribute argument [PR95192] Another SFINAE issue: we weren't propagating substitution failure in attributes back up. And tsubst_function_decl needs to check substitution before register_specialization. I thought about moving the other error returns up as well, but they aren't SFINAE cases, so they can stay where they are. This change caused pr84630.C to stop giving an error; this was because partial instantiation of the lambda failed silently, and before the change that meant error_mark_node passed to decl_attributes, which complained about there being an argument at all. With the change the partial instantiation fails, but no error was ever given, because push_template_decl silently failed if current_template_parms wasn't set. So let's set c_t_p appropriately. lambda-uneval13.C is a valid testcase to exercise this. gcc/cp/ChangeLog: PR c++/95192 * pt.c (tsubst_attribute): Handle error. (apply_late_template_attributes): Return false on error. (tsubst_function_decl): Check its return value. (tsubst_decl): Likewise. (push_template_decl): Assert current_template_parms. (tsubst_template_decl): Set current_template_parms. gcc/testsuite/ChangeLog: PR c++/95192 * g++.dg/cpp0x/pr84630.C: Call b(). * g++.dg/cpp2a/lambda-uneval13.C: New test. * g++.dg/ext/attr-expr1.C: New test. --- gcc/cp/pt.c | 41 ++++++++++++++++++---------- gcc/testsuite/g++.dg/cpp0x/pr84630.C | 1 + gcc/testsuite/g++.dg/cpp2a/lambda-uneval13.C | 11 ++++++++ gcc/testsuite/g++.dg/ext/attr-expr1.C | 9 ++++++ 4 files changed, 48 insertions(+), 14 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp2a/lambda-uneval13.C create mode 100644 gcc/testsuite/g++.dg/ext/attr-expr1.C (limited to 'gcc') diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index c5b0a92..af7c67a 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -11571,6 +11571,8 @@ tsubst_attribute (tree t, tree *decl_p, tree args, val = tsubst_expr (val, args, complain, in_decl, /*integral_constant_expression_p=*/false); + if (val == error_mark_node) + return error_mark_node; if (val != TREE_VALUE (t)) return build_tree_list (TREE_PURPOSE (t), val); return t; @@ -11617,9 +11619,10 @@ tsubst_attributes (tree attributes, tree args, /* Apply any attributes which had to be deferred until instantiation time. DECL_P, ATTRIBUTES and ATTR_FLAGS are as cplus_decl_attributes; - ARGS, COMPLAIN, IN_DECL are as tsubst. */ + ARGS, COMPLAIN, IN_DECL are as tsubst. Returns true normally, + false on error. */ -static void +static bool apply_late_template_attributes (tree *decl_p, tree attributes, int attr_flags, tree args, tsubst_flags_t complain, tree in_decl) { @@ -11628,12 +11631,12 @@ apply_late_template_attributes (tree *decl_p, tree attributes, int attr_flags, tree *p; if (attributes == NULL_TREE) - return; + return true; if (DECL_P (*decl_p)) { if (TREE_TYPE (*decl_p) == error_mark_node) - return; + return false; p = &DECL_ATTRIBUTES (*decl_p); /* DECL_ATTRIBUTES comes from copy_node in tsubst_decl, and is identical to our attributes parameter. */ @@ -11668,9 +11671,11 @@ apply_late_template_attributes (tree *decl_p, tree attributes, int attr_flags, t = *p; if (ATTR_IS_DEPENDENT (t)) { + *q = tsubst_attribute (t, decl_p, args, complain, in_decl); + if (*q == error_mark_node) + return false; *p = TREE_CHAIN (t); TREE_CHAIN (t) = NULL_TREE; - *q = tsubst_attribute (t, decl_p, args, complain, in_decl); while (*q) q = &TREE_CHAIN (*q); } @@ -11680,6 +11685,7 @@ apply_late_template_attributes (tree *decl_p, tree attributes, int attr_flags, cplus_decl_attributes (decl_p, late_attrs, attr_flags); } + return true; } /* The template TMPL is being instantiated with the template arguments TARGS. @@ -14048,6 +14054,10 @@ tsubst_function_decl (tree t, tree args, tsubst_flags_t complain, tsubst (DECL_FRIEND_CONTEXT (t), args, complain, in_decl)); + if (!apply_late_template_attributes (&r, DECL_ATTRIBUTES (r), 0, + args, complain, in_decl)) + return error_mark_node; + /* Set up the DECL_TEMPLATE_INFO for R. There's no need to do this in the special friend case mentioned above where GEN_TMPL is NULL. */ @@ -14127,8 +14137,6 @@ tsubst_function_decl (tree t, tree args, tsubst_flags_t complain, && !processing_template_decl) defaulted_late_check (r); - apply_late_template_attributes (&r, DECL_ATTRIBUTES (r), 0, - args, complain, in_decl); if (flag_openmp) if (tree attr = lookup_attribute ("omp declare variant base", DECL_ATTRIBUTES (r))) @@ -14228,7 +14236,9 @@ tsubst_template_decl (tree t, tree args, tsubst_flags_t complain, /* The template parameters for this new template are all the template parameters for the old template, except the outermost level of parameters. */ + auto tparm_guard = make_temp_override (current_template_parms); DECL_TEMPLATE_PARMS (r) + = current_template_parms = tsubst_template_parms (DECL_TEMPLATE_PARMS (t), args, complain); @@ -14491,8 +14501,9 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain) if (!DECL_TEMPLATE_PARM_P (r)) DECL_ARG_TYPE (r) = type_passed_as (type); - apply_late_template_attributes (&r, DECL_ATTRIBUTES (r), 0, - args, complain, in_decl); + if (!apply_late_template_attributes (&r, DECL_ATTRIBUTES (r), 0, + args, complain, in_decl)) + return error_mark_node; /* Keep track of the first new parameter we generate. That's what will be returned to the @@ -14581,8 +14592,9 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain) finish_member_declaration. */ DECL_CHAIN (r) = NULL_TREE; - apply_late_template_attributes (&r, DECL_ATTRIBUTES (r), 0, - args, complain, in_decl); + if (!apply_late_template_attributes (&r, DECL_ATTRIBUTES (r), 0, + args, complain, in_decl)) + return error_mark_node; if (vec) TREE_VEC_ELT (vec, i) = r; @@ -14901,9 +14913,10 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain) DECL_CHAIN (r) = NULL_TREE; - apply_late_template_attributes (&r, DECL_ATTRIBUTES (r), - /*flags=*/0, - args, complain, in_decl); + if (!apply_late_template_attributes (&r, DECL_ATTRIBUTES (r), + /*flags=*/0, + args, complain, in_decl)) + return error_mark_node; /* Preserve a typedef that names a type. */ if (is_typedef_decl (r) && type != error_mark_node) diff --git a/gcc/testsuite/g++.dg/cpp0x/pr84630.C b/gcc/testsuite/g++.dg/cpp0x/pr84630.C index 3c2b4e4..7d6361b 100644 --- a/gcc/testsuite/g++.dg/cpp0x/pr84630.C +++ b/gcc/testsuite/g++.dg/cpp0x/pr84630.C @@ -5,3 +5,4 @@ template struct c { template __attribute__((noinline([] {}))) int b(); // { dg-error "wrong number of arguments" } }; c<> a; +int i = a.b<42>(); diff --git a/gcc/testsuite/g++.dg/cpp2a/lambda-uneval13.C b/gcc/testsuite/g++.dg/cpp2a/lambda-uneval13.C new file mode 100644 index 0000000..df908f0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/lambda-uneval13.C @@ -0,0 +1,11 @@ +// { dg-do compile { target c++20 } } + +template struct A +{ + template void spam(decltype([]{}) *s = nullptr) { } +}; + +void foo() +{ + A().spam(); +} diff --git a/gcc/testsuite/g++.dg/ext/attr-expr1.C b/gcc/testsuite/g++.dg/ext/attr-expr1.C new file mode 100644 index 0000000..990e710 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attr-expr1.C @@ -0,0 +1,9 @@ +// PR c++/95192 + +template +__attribute__((assume_aligned(sizeof(int(T()))))) // { dg-message "function type" } +T *f(); + +void test21() { + void *p = f() // { dg-error "no match" } +} -- cgit v1.1 From 787f3ebf00d4e1f741ea03b6ddea9cf07a6f94ac Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 3 Feb 2021 21:56:59 -0500 Subject: c++: No aggregate CTAD with explicit dguide [PR98802] In my implementation of P2082R1 I missed this piece: the aggregate deduction candidate is not generated if the class has user-written deduction guides. gcc/cp/ChangeLog: PR c++/98802 * pt.c (do_class_deduction): No aggregate guide if any_dguides_p. gcc/testsuite/ChangeLog: PR c++/98802 * g++.dg/cpp1z/class-deduction78.C: New test. --- gcc/cp/pt.c | 5 +++-- gcc/testsuite/g++.dg/cpp1z/class-deduction78.C | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp1z/class-deduction78.C (limited to 'gcc') diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index af7c67a..3605b67 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -29272,8 +29272,9 @@ do_class_deduction (tree ptype, tree tmpl, tree init, } } - if (tree guide = maybe_aggr_guide (tmpl, init, args)) - cands = lookup_add (guide, cands); + if (!any_dguides_p) + if (tree guide = maybe_aggr_guide (tmpl, init, args)) + cands = lookup_add (guide, cands); tree call = error_mark_node; diff --git a/gcc/testsuite/g++.dg/cpp1z/class-deduction78.C b/gcc/testsuite/g++.dg/cpp1z/class-deduction78.C new file mode 100644 index 0000000..6516454 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/class-deduction78.C @@ -0,0 +1,20 @@ +// PR c++/98802 +// { dg-do compile { target c++17 } } + +using size_t = decltype(sizeof(42)); + +template +struct List { + T head; + List tail; +}; + +template +struct List {}; + +template List(T) -> List; +template List(T, List) -> List; + +int main() { + auto list2 = List{0, List{1, List{2}}}; +} -- cgit v1.1 From 5eb792e7a12ad214e5295e3f664637078936213f Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Wed, 3 Feb 2021 14:32:04 +0100 Subject: doc: mention -mprefer-vector-width in target attrs gcc/ChangeLog: * doc/extend.texi: Mention -mprefer-vector-width in target attributes. gcc/testsuite/ChangeLog: * gcc.target/i386/prefer-vector-width-attr.c: New test. --- gcc/doc/extend.texi | 22 ++++++++++++++++++++++ .../gcc.target/i386/prefer-vector-width-attr.c | 11 +++++++++++ 2 files changed, 33 insertions(+) create mode 100644 gcc/testsuite/gcc.target/i386/prefer-vector-width-attr.c (limited to 'gcc') diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi index 8daa1c6..2cfd8cd 100644 --- a/gcc/doc/extend.texi +++ b/gcc/doc/extend.texi @@ -7020,6 +7020,28 @@ On x86 targets, the @code{fentry_section} attribute sets the name of the section to record function entry instrumentation calls in when enabled with @option{-pg -mrecord-mcount} +@item prefer-vector-width=@var{OPT} +@cindex @code{prefer-vector-width} function attribute, x86 +On x86 targets, the @code{prefer-vector-width} attribute informs the +compiler to use @var{OPT}-bit vector width in instructions +instead of the default on the selected platform. + +Valid @var{OPT} values are: + +@table @samp +@item none +No extra limitations applied to GCC other than defined by the selected platform. + +@item 128 +Prefer 128-bit vector width for instructions. + +@item 256 +Prefer 256-bit vector width for instructions. + +@item 512 +Prefer 512-bit vector width for instructions. +@end table + @end table On the x86, the inliner does not inline a diff --git a/gcc/testsuite/gcc.target/i386/prefer-vector-width-attr.c b/gcc/testsuite/gcc.target/i386/prefer-vector-width-attr.c new file mode 100644 index 0000000..3929f90 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/prefer-vector-width-attr.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ + +#pragma GCC push_options +#pragma GCC target("prefer-vector-width=512") + +int +__attribute__((target("prefer-vector-width=none"))) +main() +{ + return 0; +} -- cgit v1.1 From f0e618faeb619ec02dabbef203a5575fca44a7f7 Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Thu, 4 Feb 2021 12:32:59 +0100 Subject: Fortran: OpenMP/OpenACC diagnose substring rejections better gcc/fortran/ChangeLog: * openmp.c (resolve_omp_clauses): Explicitly diagnose substrings as not permitted. gcc/testsuite/ChangeLog: * gfortran.dg/goacc/substring.f90: New test. * gfortran.dg/gomp/substring.f90: New test. --- gcc/fortran/openmp.c | 8 +++++++- gcc/testsuite/gfortran.dg/goacc/substring.f90 | 27 +++++++++++++++++++++++++++ gcc/testsuite/gfortran.dg/gomp/substring.f90 | 22 ++++++++++++++++++++++ 3 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gfortran.dg/goacc/substring.f90 create mode 100644 gcc/testsuite/gfortran.dg/gomp/substring.f90 (limited to 'gcc') diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c index 9a3a8f6..aab17f0 100644 --- a/gcc/fortran/openmp.c +++ b/gcc/fortran/openmp.c @@ -5212,7 +5212,13 @@ resolve_omp_clauses (gfc_code *code, gfc_omp_clauses *omp_clauses, || (n->expr && (!resolved || n->expr->expr_type != EXPR_VARIABLE))) { - if (!resolved + if (array_ref + && (array_ref->type == REF_SUBSTRING + || (array_ref->next + && array_ref->next->type == REF_SUBSTRING))) + gfc_error ("Unexpected substring reference in %s clause " + "at %L", name, &n->where); + else if (!resolved || n->expr->expr_type != EXPR_VARIABLE || array_ref->next || array_ref->type != REF_ARRAY) diff --git a/gcc/testsuite/gfortran.dg/goacc/substring.f90 b/gcc/testsuite/gfortran.dg/goacc/substring.f90 new file mode 100644 index 0000000..25031da --- /dev/null +++ b/gcc/testsuite/gfortran.dg/goacc/substring.f90 @@ -0,0 +1,27 @@ +implicit none +character(len=10) :: str1, str2(5,5) + +type t + character(len=10) :: str1, str2(5,5) +end type t +type(t) :: v + +!$acc enter data copyin(v%str1) ! OK +!$acc enter data copyin(v%str2) ! OK +!$acc enter data copyin(v%str2(1,2)) ! OK +!$acc enter data copyin(str1) ! OK +!$acc enter data copyin(str2) ! OK +!$acc enter data copyin(str2(1,2)) ! OK + +!$acc enter data copyin(v%str1(2:5)) ! { dg-error "Unexpected substring reference in MAP clause" } +!$acc enter data copyin(v%str2(1,2)(2:4)) ! { dg-error "Unexpected substring reference in MAP clause" } +!$acc enter data copyin(str1(2:5)) ! { dg-error "Unexpected substring reference in MAP clause" } +!$acc enter data copyin(str2(1,2)(2:4)) ! { dg-error "Unexpected substring reference in MAP clause" } + +!$acc parallel +!$acc update host(v%str1(2:5)) ! { dg-error "Unexpected substring reference in MAP clause" } +!$acc update host(v%str2(1,2)(2:4)) ! { dg-error "Unexpected substring reference in MAP clause" } +!$acc update host(str1(2:5)) ! { dg-error "Unexpected substring reference in MAP clause" } +!$acc update host(str2(1,2)(2:4)) ! { dg-error "Unexpected substring reference in MAP clause" } +!$acc end parallel +end diff --git a/gcc/testsuite/gfortran.dg/gomp/substring.f90 b/gcc/testsuite/gfortran.dg/gomp/substring.f90 new file mode 100644 index 0000000..23d7fb7 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/gomp/substring.f90 @@ -0,0 +1,22 @@ +implicit none +character(len=10) :: str1, str2(5,5) + +type t + character(len=10) :: str1, str2(5,5) +end type t +type(t) :: v + +!$omp target enter data map(to: str1) ! OK +!$omp target enter data map(to: str2) ! OK +!$omp target enter data map(to: str2(2,5)) ! OK + +!$omp target enter data map(to: str1(2,5)) ! { dg-error "Syntax error in OpenMP variable list" } +!$omp target enter data map(to: str2(1,2)(2:4)) ! { dg-error "Unexpected substring reference in MAP clause" } + +!$omp target enter data map(to: v%str1) ! OK +!$omp target enter data map(to: v%str2) ! OK +!$omp target enter data map(to: v%str2(1,2)) ! OK + +!$omp target enter data map(to: v%str1(2:5)) ! { dg-error "Unexpected substring reference in MAP clause" } +!$omp target enter data map(to: v%str2(1,2)(2:4)) ! { dg-error "Unexpected substring reference in MAP clause" } +end -- cgit v1.1 From 7002a33d1ba81e4577d965fb9daaee146b31faa8 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Thu, 4 Feb 2021 12:08:47 +0100 Subject: tree-optimization/98855 - fix some vectorizer cost issues This fixes us not costing vectorized bswap for SLP as well as avoiding biasing to the vectorized side when costing single-argument PHIs. Instead we assume coalescing here and cost them with zero cost for both the scalar and vectorized code. This doesn't fix the PR on its own. 2021-02-04 Richard Biener PR tree-optimization/98855 * tree-vect-loop.c (vectorizable_phi): Do not cost single-argument PHIs. * tree-vect-slp.c (vect_bb_slp_scalar_cost): Likewise. * tree-vect-stmts.c (vectorizable_bswap): Also perform costing for SLP operation. --- gcc/tree-vect-loop.c | 8 ++++++-- gcc/tree-vect-slp.c | 7 +++++++ gcc/tree-vect-stmts.c | 13 ++++++------- 3 files changed, 19 insertions(+), 9 deletions(-) (limited to 'gcc') diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index 200ed27..f1f16e3 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -7777,8 +7777,12 @@ vectorizable_phi (vec_info *, "incompatible vector types for invariants\n"); return false; } - record_stmt_cost (cost_vec, SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node), - vector_stmt, stmt_info, vectype, 0, vect_body); + /* For single-argument PHIs assume coalescing which means zero cost + for the scalar and the vector PHIs. This avoids artificially + favoring the vector path (but may pessimize it in some cases). */ + if (gimple_phi_num_args (as_a (stmt_info->stmt)) > 1) + record_stmt_cost (cost_vec, SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node), + vector_stmt, stmt_info, vectype, 0, vect_body); STMT_VINFO_TYPE (stmt_info) = phi_info_type; return true; } diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c index 10b876f..2305bbd 100644 --- a/gcc/tree-vect-slp.c +++ b/gcc/tree-vect-slp.c @@ -4297,6 +4297,13 @@ vect_bb_slp_scalar_cost (vec_info *vinfo, } else if (vect_nop_conversion_p (orig_stmt_info)) continue; + /* For single-argument PHIs assume coalescing which means zero cost + for the scalar and the vector PHIs. This avoids artificially + favoring the vector path (but may pessimize it in some cases). */ + else if (is_a (orig_stmt_info->stmt) + && gimple_phi_num_args + (as_a (orig_stmt_info->stmt)) == 1) + continue; else kind = scalar_stmt; record_stmt_cost (cost_vec, 1, kind, orig_stmt_info, diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index 5eb7b2d..0bc1cb1c 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -3002,13 +3002,12 @@ vectorizable_bswap (vec_info *vinfo, STMT_VINFO_TYPE (stmt_info) = call_vec_info_type; DUMP_VECT_SCOPE ("vectorizable_bswap"); - if (! slp_node) - { - record_stmt_cost (cost_vec, - 1, vector_stmt, stmt_info, 0, vect_prologue); - record_stmt_cost (cost_vec, - ncopies, vec_perm, stmt_info, 0, vect_body); - } + record_stmt_cost (cost_vec, + 1, vector_stmt, stmt_info, 0, vect_prologue); + record_stmt_cost (cost_vec, + slp_node + ? SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node) : ncopies, + vec_perm, stmt_info, 0, vect_body); return true; } -- cgit v1.1 From 1d6228454c4bca003c6ecedad67866515503b910 Mon Sep 17 00:00:00 2001 From: Jonathan Wright Date: Wed, 3 Feb 2021 14:46:00 +0000 Subject: aarch64: Use RTL builtins for [su]mull_high_n intrinsics Rewrite [su]mull_high_n Neon intrinsics to use RTL builtins rather than inline assembly code, allowing for better scheduling and optimization. gcc/ChangeLog: 2021-02-03 Jonathan Wright * config/aarch64/aarch64-simd-builtins.def: Add [su]mull_hi_n builtin generator macros. * config/aarch64/aarch64-simd.md (aarch64_mull_hi_n_insn): Define. (aarch64_mull_hi_n): Define. * config/aarch64/arm_neon.h (vmull_high_n_s16): Use RTL builtin instead of inline asm. (vmull_high_n_s32): Likewise. (vmull_high_n_u16): Likewise. (vmull_high_n_u32): Likewise. --- gcc/config/aarch64/aarch64-simd-builtins.def | 3 +++ gcc/config/aarch64/aarch64-simd.md | 27 +++++++++++++++++++++++++++ gcc/config/aarch64/arm_neon.h | 28 ++++------------------------ 3 files changed, 34 insertions(+), 24 deletions(-) (limited to 'gcc') diff --git a/gcc/config/aarch64/aarch64-simd-builtins.def b/gcc/config/aarch64/aarch64-simd-builtins.def index b787cb9..4dac8e0 100644 --- a/gcc/config/aarch64/aarch64-simd-builtins.def +++ b/gcc/config/aarch64/aarch64-simd-builtins.def @@ -300,6 +300,9 @@ BUILTIN_VD_HSI (BINOP, smull_n, 0, NONE) BUILTIN_VD_HSI (BINOPU, umull_n, 0, NONE) + BUILTIN_VQ_HSI (BINOP, smull_hi_n, 0, NONE) + BUILTIN_VQ_HSI (BINOPU, umull_hi_n, 0, NONE) + BUILTIN_VD_HSI (TERNOP_LANE, vec_smult_lane_, 0, NONE) BUILTIN_VD_HSI (QUADOP_LANE, vec_smlal_lane_, 0, NONE) BUILTIN_VD_HSI (TERNOP_LANE, vec_smult_laneq_, 0, NONE) diff --git a/gcc/config/aarch64/aarch64-simd.md b/gcc/config/aarch64/aarch64-simd.md index 393bab1..1d1ba37 100644 --- a/gcc/config/aarch64/aarch64-simd.md +++ b/gcc/config/aarch64/aarch64-simd.md @@ -2266,6 +2266,33 @@ [(set_attr "type" "neon_mul__scalar_long")] ) +(define_insn "aarch64_mull_hi_n_insn" + [(set (match_operand: 0 "register_operand" "=w") + (mult: + (ANY_EXTEND: (vec_select: + (match_operand:VQ_HSI 1 "register_operand" "w") + (match_operand:VQ_HSI 3 "vect_par_cnst_hi_half" ""))) + (ANY_EXTEND: + (vec_duplicate: + (match_operand: 2 "register_operand" "")))))] + "TARGET_SIMD" + "mull2\\t%0., %1., %2.[0]" + [(set_attr "type" "neon_mul__scalar_long")] +) + +(define_expand "aarch64_mull_hi_n" + [(match_operand: 0 "register_operand") + (ANY_EXTEND: (match_operand:VQ_HSI 1 "register_operand")) + (match_operand: 2 "register_operand")] + "TARGET_SIMD" + { + rtx p = aarch64_simd_vect_par_cnst_half (mode, , true); + emit_insn (gen_aarch64_mull_hi_n_insn (operands[0], operands[1], + operands[2], p)); + DONE; + } +) + ;; vmlal_lane_s16 intrinsics (define_insn "aarch64_vec_mlal_lane" [(set (match_operand: 0 "register_operand" "=w") diff --git a/gcc/config/aarch64/arm_neon.h b/gcc/config/aarch64/arm_neon.h index d50bd65..fffd7b7 100644 --- a/gcc/config/aarch64/arm_neon.h +++ b/gcc/config/aarch64/arm_neon.h @@ -8275,48 +8275,28 @@ __extension__ extern __inline int32x4_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vmull_high_n_s16 (int16x8_t __a, int16_t __b) { - int32x4_t __result; - __asm__ ("smull2 %0.4s,%1.8h,%2.h[0]" - : "=w"(__result) - : "w"(__a), "x"(__b) - : /* No clobbers */); - return __result; + return __builtin_aarch64_smull_hi_nv8hi (__a, __b); } __extension__ extern __inline int64x2_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vmull_high_n_s32 (int32x4_t __a, int32_t __b) { - int64x2_t __result; - __asm__ ("smull2 %0.2d,%1.4s,%2.s[0]" - : "=w"(__result) - : "w"(__a), "w"(__b) - : /* No clobbers */); - return __result; + return __builtin_aarch64_smull_hi_nv4si (__a, __b); } __extension__ extern __inline uint32x4_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vmull_high_n_u16 (uint16x8_t __a, uint16_t __b) { - uint32x4_t __result; - __asm__ ("umull2 %0.4s,%1.8h,%2.h[0]" - : "=w"(__result) - : "w"(__a), "x"(__b) - : /* No clobbers */); - return __result; + return __builtin_aarch64_umull_hi_nv8hi_uuu (__a, __b); } __extension__ extern __inline uint64x2_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vmull_high_n_u32 (uint32x4_t __a, uint32_t __b) { - uint64x2_t __result; - __asm__ ("umull2 %0.2d,%1.4s,%2.s[0]" - : "=w"(__result) - : "w"(__a), "w"(__b) - : /* No clobbers */); - return __result; + return __builtin_aarch64_umull_hi_nv4si_uuu (__a, __b); } __extension__ extern __inline poly16x8_t -- cgit v1.1 From aa652fb2a083c15678f82a5cb20b7f8cbc9c1437 Mon Sep 17 00:00:00 2001 From: Jonathan Wright Date: Wed, 3 Feb 2021 17:01:53 +0000 Subject: aarch64: Use RTL builtins for [su]mull_high_lane[q] intrinsics Rewrite [su]mull_high_lane[q] Neon intrinsics to use RTL builtins rather than inline assembly code, allowing for better scheduling and optimization. gcc/ChangeLog: 2021-02-03 Jonathan Wright * config/aarch64/aarch64-simd-builtins.def: Add [su]mull_hi_lane[q] builtin generator macros. * config/aarch64/aarch64-simd.md (aarch64_mull_hi_lane_insn): Define. (aarch64_mull_hi_lane): Define. (aarch64_mull_hi_laneq_insn): Define. (aarch64_mull_hi_laneq): Define. * config/aarch64/arm_neon.h (vmull_high_lane_s16): Use RTL builtin instead of inline asm. (vmull_high_lane_s32): Likewise. (vmull_high_lane_u16): Likewise. (vmull_high_lane_u32): Likewise. (vmull_high_laneq_s16): Likewise. (vmull_high_laneq_s32): Likewise. (vmull_high_laneq_u16): Likewise. (vmull_high_laneq_u32): Liekwise. --- gcc/config/aarch64/aarch64-simd-builtins.def | 5 + gcc/config/aarch64/aarch64-simd.md | 64 ++++++++++++ gcc/config/aarch64/arm_neon.h | 145 +++++++++------------------ 3 files changed, 118 insertions(+), 96 deletions(-) (limited to 'gcc') diff --git a/gcc/config/aarch64/aarch64-simd-builtins.def b/gcc/config/aarch64/aarch64-simd-builtins.def index 4dac8e0..29a7bbc 100644 --- a/gcc/config/aarch64/aarch64-simd-builtins.def +++ b/gcc/config/aarch64/aarch64-simd-builtins.def @@ -303,6 +303,11 @@ BUILTIN_VQ_HSI (BINOP, smull_hi_n, 0, NONE) BUILTIN_VQ_HSI (BINOPU, umull_hi_n, 0, NONE) + BUILTIN_VQ_HSI (TERNOP_LANE, smull_hi_lane, 0, NONE) + BUILTIN_VQ_HSI (TERNOP_LANE, smull_hi_laneq, 0, NONE) + BUILTIN_VQ_HSI (TERNOPU_LANE, umull_hi_lane, 0, NONE) + BUILTIN_VQ_HSI (TERNOPU_LANE, umull_hi_laneq, 0, NONE) + BUILTIN_VD_HSI (TERNOP_LANE, vec_smult_lane_, 0, NONE) BUILTIN_VD_HSI (QUADOP_LANE, vec_smlal_lane_, 0, NONE) BUILTIN_VD_HSI (TERNOP_LANE, vec_smult_laneq_, 0, NONE) diff --git a/gcc/config/aarch64/aarch64-simd.md b/gcc/config/aarch64/aarch64-simd.md index 1d1ba37..60eeddc 100644 --- a/gcc/config/aarch64/aarch64-simd.md +++ b/gcc/config/aarch64/aarch64-simd.md @@ -2253,6 +2253,70 @@ [(set_attr "type" "neon_mul__scalar_long")] ) +(define_insn "aarch64_mull_hi_lane_insn" + [(set (match_operand: 0 "register_operand" "=w") + (mult: + (ANY_EXTEND: (vec_select: + (match_operand:VQ_HSI 1 "register_operand" "w") + (match_operand:VQ_HSI 2 "vect_par_cnst_hi_half" ""))) + (ANY_EXTEND: (vec_duplicate: + (vec_select: + (match_operand: 3 "register_operand" "") + (parallel [(match_operand:SI 4 "immediate_operand" "i")]))))))] + "TARGET_SIMD" + { + operands[4] = aarch64_endian_lane_rtx (mode, INTVAL (operands[4])); + return "mull2\\t%0., %1., %3.[%4]"; + } + [(set_attr "type" "neon_mul__scalar_long")] +) + +(define_expand "aarch64_mull_hi_lane" + [(match_operand: 0 "register_operand") + (ANY_EXTEND:(match_operand:VQ_HSI 1 "register_operand")) + (match_operand: 2 "register_operand") + (match_operand:SI 3 "immediate_operand")] + "TARGET_SIMD" +{ + rtx p = aarch64_simd_vect_par_cnst_half (mode, , true); + emit_insn (gen_aarch64_mull_hi_lane_insn (operands[0], + operands[1], p, operands[2], operands[3])); + DONE; +} +) + +(define_insn "aarch64_mull_hi_laneq_insn" + [(set (match_operand: 0 "register_operand" "=w") + (mult: + (ANY_EXTEND: (vec_select: + (match_operand:VQ_HSI 1 "register_operand" "w") + (match_operand:VQ_HSI 2 "vect_par_cnst_hi_half" ""))) + (ANY_EXTEND: (vec_duplicate: + (vec_select: + (match_operand: 3 "register_operand" "") + (parallel [(match_operand:SI 4 "immediate_operand" "i")]))))))] + "TARGET_SIMD" + { + operands[4] = aarch64_endian_lane_rtx (mode, INTVAL (operands[4])); + return "mull2\\t%0., %1., %3.[%4]"; + } + [(set_attr "type" "neon_mul__scalar_long")] +) + +(define_expand "aarch64_mull_hi_laneq" + [(match_operand: 0 "register_operand") + (ANY_EXTEND:(match_operand:VQ_HSI 1 "register_operand")) + (match_operand: 2 "register_operand") + (match_operand:SI 3 "immediate_operand")] + "TARGET_SIMD" +{ + rtx p = aarch64_simd_vect_par_cnst_half (mode, , true); + emit_insn (gen_aarch64_mull_hi_laneq_insn (operands[0], + operands[1], p, operands[2], operands[3])); + DONE; +} +) + (define_insn "aarch64_mull_n" [(set (match_operand: 0 "register_operand" "=w") (mult: diff --git a/gcc/config/aarch64/arm_neon.h b/gcc/config/aarch64/arm_neon.h index fffd7b7..2d776ef 100644 --- a/gcc/config/aarch64/arm_neon.h +++ b/gcc/config/aarch64/arm_neon.h @@ -8167,109 +8167,62 @@ vshrn_n_u64 (uint64x2_t __a, const int __b) { return (uint32x2_t)__builtin_aarch64_shrnv2di ((int64x2_t)__a, __b); } -#define vmull_high_lane_s16(a, b, c) \ - __extension__ \ - ({ \ - int16x4_t b_ = (b); \ - int16x8_t a_ = (a); \ - int32x4_t result; \ - __asm__ ("smull2 %0.4s, %1.8h, %2.h[%3]" \ - : "=w"(result) \ - : "w"(a_), "x"(b_), "i"(c) \ - : /* No clobbers */); \ - result; \ - }) -#define vmull_high_lane_s32(a, b, c) \ - __extension__ \ - ({ \ - int32x2_t b_ = (b); \ - int32x4_t a_ = (a); \ - int64x2_t result; \ - __asm__ ("smull2 %0.2d, %1.4s, %2.s[%3]" \ - : "=w"(result) \ - : "w"(a_), "w"(b_), "i"(c) \ - : /* No clobbers */); \ - result; \ - }) +__extension__ extern __inline int32x4_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vmull_high_lane_s16 (int16x8_t __a, int16x4_t __v, const int __lane) +{ + return __builtin_aarch64_smull_hi_lanev8hi (__a, __v, __lane); +} -#define vmull_high_lane_u16(a, b, c) \ - __extension__ \ - ({ \ - uint16x4_t b_ = (b); \ - uint16x8_t a_ = (a); \ - uint32x4_t result; \ - __asm__ ("umull2 %0.4s, %1.8h, %2.h[%3]" \ - : "=w"(result) \ - : "w"(a_), "x"(b_), "i"(c) \ - : /* No clobbers */); \ - result; \ - }) +__extension__ extern __inline int64x2_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vmull_high_lane_s32 (int32x4_t __a, int32x2_t __v, const int __lane) +{ + return __builtin_aarch64_smull_hi_lanev4si (__a, __v, __lane); +} -#define vmull_high_lane_u32(a, b, c) \ - __extension__ \ - ({ \ - uint32x2_t b_ = (b); \ - uint32x4_t a_ = (a); \ - uint64x2_t result; \ - __asm__ ("umull2 %0.2d, %1.4s, %2.s[%3]" \ - : "=w"(result) \ - : "w"(a_), "w"(b_), "i"(c) \ - : /* No clobbers */); \ - result; \ - }) +__extension__ extern __inline uint32x4_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vmull_high_lane_u16 (uint16x8_t __a, uint16x4_t __v, const int __lane) +{ + return __builtin_aarch64_umull_hi_lanev8hi_uuus (__a, __v, __lane); +} -#define vmull_high_laneq_s16(a, b, c) \ - __extension__ \ - ({ \ - int16x8_t b_ = (b); \ - int16x8_t a_ = (a); \ - int32x4_t result; \ - __asm__ ("smull2 %0.4s, %1.8h, %2.h[%3]" \ - : "=w"(result) \ - : "w"(a_), "x"(b_), "i"(c) \ - : /* No clobbers */); \ - result; \ - }) +__extension__ extern __inline uint64x2_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vmull_high_lane_u32 (uint32x4_t __a, uint32x2_t __v, const int __lane) +{ + return __builtin_aarch64_umull_hi_lanev4si_uuus (__a, __v, __lane); +} -#define vmull_high_laneq_s32(a, b, c) \ - __extension__ \ - ({ \ - int32x4_t b_ = (b); \ - int32x4_t a_ = (a); \ - int64x2_t result; \ - __asm__ ("smull2 %0.2d, %1.4s, %2.s[%3]" \ - : "=w"(result) \ - : "w"(a_), "w"(b_), "i"(c) \ - : /* No clobbers */); \ - result; \ - }) +__extension__ extern __inline int32x4_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vmull_high_laneq_s16 (int16x8_t __a, int16x8_t __v, const int __lane) +{ + return __builtin_aarch64_smull_hi_laneqv8hi (__a, __v, __lane); +} -#define vmull_high_laneq_u16(a, b, c) \ - __extension__ \ - ({ \ - uint16x8_t b_ = (b); \ - uint16x8_t a_ = (a); \ - uint32x4_t result; \ - __asm__ ("umull2 %0.4s, %1.8h, %2.h[%3]" \ - : "=w"(result) \ - : "w"(a_), "x"(b_), "i"(c) \ - : /* No clobbers */); \ - result; \ - }) +__extension__ extern __inline int64x2_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vmull_high_laneq_s32 (int32x4_t __a, int32x4_t __v, const int __lane) +{ + return __builtin_aarch64_smull_hi_laneqv4si (__a, __v, __lane); +} -#define vmull_high_laneq_u32(a, b, c) \ - __extension__ \ - ({ \ - uint32x4_t b_ = (b); \ - uint32x4_t a_ = (a); \ - uint64x2_t result; \ - __asm__ ("umull2 %0.2d, %1.4s, %2.s[%3]" \ - : "=w"(result) \ - : "w"(a_), "w"(b_), "i"(c) \ - : /* No clobbers */); \ - result; \ - }) +__extension__ extern __inline uint32x4_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vmull_high_laneq_u16 (uint16x8_t __a, uint16x8_t __v, const int __lane) +{ + return __builtin_aarch64_umull_hi_laneqv8hi_uuus (__a, __v, __lane); +} + +__extension__ extern __inline uint64x2_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +vmull_high_laneq_u32 (uint32x4_t __a, uint32x4_t __v, const int __lane) +{ + return __builtin_aarch64_umull_hi_laneqv4si_uuus (__a, __v, __lane); +} __extension__ extern __inline int32x4_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -- cgit v1.1 From e6cc142ad99ab8d28581f4ce61056c9cce74dba3 Mon Sep 17 00:00:00 2001 From: "Tom Greenslade (thomgree)" Date: Wed, 3 Feb 2021 11:31:53 +0000 Subject: c++: fix string literal member initializer bug [PR90926] build_aggr_conv did not correctly handle string literal member initializers. Extended can_convert_array to handle this case. For the additional check of compatibility of character types, factored out code from digest_init_r into a new function. gcc/cp/ChangeLog: PR c++/90926 * call.c (can_convert_array): Extend to handle all valid aggregate initializers of an array; including by string literals, not just by brace-init-list. (build_aggr_conv): Call can_convert_array more often, not just in brace-init-list case. * typeck2.c (array_string_literal_compatible_p): New function. (digest_init_r): call array_string_literal_compatible_p * cp-tree.h: (array_string_literal_compatible_p): Declare. gcc/testsuite/ChangeLog: PR c++/90926 * g++.dg/cpp1y/nsdmi-aggr12.C: New test. --- gcc/cp/call.c | 48 ++++++++++++++++++------------- gcc/cp/cp-tree.h | 1 + gcc/cp/typeck2.c | 48 +++++++++++++++++-------------- gcc/testsuite/g++.dg/cpp1y/nsdmi-aggr12.C | 36 +++++++++++++++++++++++ 4 files changed, 92 insertions(+), 41 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp1y/nsdmi-aggr12.C (limited to 'gcc') diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 3068c0f..c7e13f3 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -895,28 +895,38 @@ strip_standard_conversion (conversion *conv) return conv; } -/* Subroutine of build_aggr_conv: check whether CTOR, a braced-init-list, - is a valid aggregate initializer for array type ATYPE. */ +/* Subroutine of build_aggr_conv: check whether FROM is a valid aggregate + initializer for array type ATYPE. */ static bool -can_convert_array (tree atype, tree ctor, int flags, tsubst_flags_t complain) +can_convert_array (tree atype, tree from, int flags, tsubst_flags_t complain) { - unsigned i; tree elttype = TREE_TYPE (atype); - for (i = 0; i < CONSTRUCTOR_NELTS (ctor); ++i) + unsigned i; + + if (TREE_CODE (from) == CONSTRUCTOR) { - tree val = CONSTRUCTOR_ELT (ctor, i)->value; - bool ok; - if (TREE_CODE (elttype) == ARRAY_TYPE - && TREE_CODE (val) == CONSTRUCTOR) - ok = can_convert_array (elttype, val, flags, complain); - else - ok = can_convert_arg (elttype, TREE_TYPE (val), val, flags, - complain); - if (!ok) - return false; + for (i = 0; i < CONSTRUCTOR_NELTS (from); ++i) + { + tree val = CONSTRUCTOR_ELT (from, i)->value; + bool ok; + if (TREE_CODE (elttype) == ARRAY_TYPE) + ok = can_convert_array (elttype, val, flags, complain); + else + ok = can_convert_arg (elttype, TREE_TYPE (val), val, flags, + complain); + if (!ok) + return false; + } + return true; } - return true; + + if (char_type_p (TYPE_MAIN_VARIANT (elttype)) + && TREE_CODE (tree_strip_any_location_wrapper (from)) == STRING_CST) + return array_string_literal_compatible_p (atype, from); + + /* No other valid way to aggregate initialize an array. */ + return false; } /* Helper for build_aggr_conv. Return true if FIELD is in PSET, or if @@ -973,8 +983,7 @@ build_aggr_conv (tree type, tree ctor, int flags, tsubst_flags_t complain) tree ftype = TREE_TYPE (idx); bool ok; - if (TREE_CODE (ftype) == ARRAY_TYPE - && TREE_CODE (val) == CONSTRUCTOR) + if (TREE_CODE (ftype) == ARRAY_TYPE) ok = can_convert_array (ftype, val, flags, complain); else ok = can_convert_arg (ftype, TREE_TYPE (val), val, flags, @@ -1021,8 +1030,7 @@ build_aggr_conv (tree type, tree ctor, int flags, tsubst_flags_t complain) val = empty_ctor; } - if (TREE_CODE (ftype) == ARRAY_TYPE - && TREE_CODE (val) == CONSTRUCTOR) + if (TREE_CODE (ftype) == ARRAY_TYPE) ok = can_convert_array (ftype, val, flags, complain); else ok = can_convert_arg (ftype, TREE_TYPE (val), val, flags, diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index aed85d7..970ed5e 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -7949,6 +7949,7 @@ extern tree split_nonconstant_init (tree, tree); extern bool check_narrowing (tree, tree, tsubst_flags_t, bool = false); extern bool ordinary_char_type_p (tree); +extern bool array_string_literal_compatible_p (tree, tree); extern tree digest_init (tree, tree, tsubst_flags_t); extern tree digest_init_flags (tree, tree, int, tsubst_flags_t); extern tree digest_nsdmi_init (tree, tree, tsubst_flags_t); diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index 9ba2897..bde305b 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -1003,6 +1003,29 @@ ordinary_char_type_p (tree type) || type == unsigned_char_type_node); } +/* True iff the string literal INIT has a type suitable for initializing array + TYPE. */ + +bool +array_string_literal_compatible_p (tree type, tree init) +{ + tree to_char_type = TYPE_MAIN_VARIANT (TREE_TYPE (type)); + tree from_char_type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (init))); + + if (to_char_type == from_char_type) + return true; + /* The array element type does not match the initializing string + literal element type; this is only allowed when both types are + ordinary character type. There are no string literals of + signed or unsigned char type in the language, but we can get + them internally from converting braced-init-lists to + STRING_CST. */ + if (ordinary_char_type_p (to_char_type) + && ordinary_char_type_p (from_char_type)) + return true; + return false; +} + /* Process the initializer INIT for a variable of type TYPE, emitting diagnostics for invalid initializers and converting the initializer as appropriate. @@ -1070,30 +1093,13 @@ digest_init_r (tree type, tree init, int nested, int flags, if (char_type_p (typ1) && TREE_CODE (stripped_init) == STRING_CST) { - tree char_type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (init))); - bool incompat_string_cst = false; - - if (typ1 != char_type) - { - /* The array element type does not match the initializing string - literal element type; this is only allowed when both types are - ordinary character type. There are no string literals of - signed or unsigned char type in the language, but we can get - them internally from converting braced-init-lists to - STRING_CST. */ - if (ordinary_char_type_p (typ1) - && ordinary_char_type_p (char_type)) - /* OK */; - else - incompat_string_cst = true; - } - - if (incompat_string_cst) + if (!array_string_literal_compatible_p (type, init)) { if (complain & tf_error) error_at (loc, "cannot initialize array of %qT from " - "a string literal with type array of %qT", - typ1, char_type); + "a string literal with type array of %qT", + typ1, + TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (init)))); return error_mark_node; } diff --git a/gcc/testsuite/g++.dg/cpp1y/nsdmi-aggr12.C b/gcc/testsuite/g++.dg/cpp1y/nsdmi-aggr12.C new file mode 100644 index 0000000..fcc1f50 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/nsdmi-aggr12.C @@ -0,0 +1,36 @@ +// PR c++/90926 +// { dg-do run { target c++14 } } + +#include + +struct A +{ + char str[4] = "foo"; + char str_array[2][4] = {"bar", "baz"}; +}; + +struct B +{ + char16_t str[10]; +}; + +int called = 0; +void f(A) { called = 1;}; +void f(B) { called = 2;}; + +int +main () +{ + A a; + a.str[0] = 'g'; + a.str_array[0][0] = 'g'; + a = {}; + + if (__builtin_strcmp (a.str, "foo") != 0) + __builtin_abort(); + if (__builtin_strcmp (a.str_array[0], "bar") != 0) + __builtin_abort(); + + f({"foo"}); assert(called == 1); + f({u"foo"}); assert(called == 2); +} -- cgit v1.1 From e91f9da57928ab10e2206c64ce490477d3b46ec1 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 4 Feb 2021 18:30:45 +0100 Subject: c++, libcpp: Use make_signed_t in the 1z diagnostics The following patch uses make_signed_t instead of make_signed::type in the diagnostics, because the former is shorter. It is true that one can't use make_signed::type in C++11 code (which is why I haven't changed it in the testcase which is c++11 effective target), but the message talks about C++23 and make_signed_t is a C++14 and later feature, so I think it is fine. 2021-02-04 Jakub Jelinek * expr.c (cpp_classify_number): Use make_signed_t instead of make_signed::type in the diagnostics. * g++.dg/warn/Wsize_t-literals.C: Expect make_signed_t instead of make_signed::type in the diagnostics. --- gcc/testsuite/g++.dg/warn/Wsize_t-literals.C | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'gcc') diff --git a/gcc/testsuite/g++.dg/warn/Wsize_t-literals.C b/gcc/testsuite/g++.dg/warn/Wsize_t-literals.C index dc0025b..ef910a5 100644 --- a/gcc/testsuite/g++.dg/warn/Wsize_t-literals.C +++ b/gcc/testsuite/g++.dg/warn/Wsize_t-literals.C @@ -8,5 +8,5 @@ std::size_t S1 = 5678ZU; // { dg-warning {use of C\+\+23 .size_t. integer consta std::size_t s2 = 1234uz; // { dg-warning {use of C\+\+23 .size_t. integer constant} "" { target c++20_down } } std::size_t S2 = 5678UZ; // { dg-warning {use of C\+\+23 .size_t. integer constant} "" { target c++20_down } } -std::make_signed::type pd1 = 1234z; // { dg-warning {use of C\+\+23 .make_signed::type. integer constant} "" { target c++20_down } } -std::make_signed::type PD1 = 5678Z; // { dg-warning {use of C\+\+23 .make_signed::type. integer constant} "" { target c++20_down } } +std::make_signed::type pd1 = 1234z; // { dg-warning {use of C\+\+23 .make_signed_t. integer constant} "" { target c++20_down } } +std::make_signed::type PD1 = 5678Z; // { dg-warning {use of C\+\+23 .make_signed_t. integer constant} "" { target c++20_down } } -- cgit v1.1 From 26fd3bf75b52c743b2c94802957c4f7379da7258 Mon Sep 17 00:00:00 2001 From: emsr <3dw4rd@verizon.net> Date: Thu, 4 Feb 2021 11:41:29 -0500 Subject: Correct date value of the __cpp_size_t_suffix macro. The value of __cpp_size_t_suffix is 202011 not 202006. gcc/c-family/ChangeLog: * c-cppbuiltin.c (c_cpp_builtins): __cpp_size_t_suffix=202011L. gcc/testsuite/ChangeLog: * g++.dg/cpp23/feat-cxx2b.C: __cpp_size_t_suffix == 202011. --- gcc/c-family/c-cppbuiltin.c | 2 +- gcc/testsuite/g++.dg/cpp23/feat-cxx2b.C | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'gcc') diff --git a/gcc/c-family/c-cppbuiltin.c b/gcc/c-family/c-cppbuiltin.c index 48dec21..9f993c4 100644 --- a/gcc/c-family/c-cppbuiltin.c +++ b/gcc/c-family/c-cppbuiltin.c @@ -1028,7 +1028,7 @@ c_cpp_builtins (cpp_reader *pfile) if (cxx_dialect > cxx20) { /* Set feature test macros for C++23. */ - cpp_define (pfile, "__cpp_size_t_suffix=202006L"); + cpp_define (pfile, "__cpp_size_t_suffix=202011L"); } if (flag_concepts) { diff --git a/gcc/testsuite/g++.dg/cpp23/feat-cxx2b.C b/gcc/testsuite/g++.dg/cpp23/feat-cxx2b.C index 94e08a4..4a342e9 100644 --- a/gcc/testsuite/g++.dg/cpp23/feat-cxx2b.C +++ b/gcc/testsuite/g++.dg/cpp23/feat-cxx2b.C @@ -544,6 +544,6 @@ #ifndef __cpp_size_t_suffix # error "__cpp_size_t_suffix" -#elif __cpp_size_t_suffix != 202006 -# error "__cpp_size_t_suffix != 202006" +#elif __cpp_size_t_suffix != 202011 +# error "__cpp_size_t_suffix != 202011" #endif -- cgit v1.1 From 65c1cb358999e9d1618834af341b31837ede839e Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Thu, 4 Feb 2021 15:20:59 -0500 Subject: diagnostics: fix excessive range-printing involving macros [PR97932] PR c/97932 describes a bug in which diagnostic_show_locus prints most of a source file. The issue is that it prints a range in which the start and end locations are part of the same macro map, but the start location is for a token in the definition of the macro, whereas the end location is for a token in an argument of the macro. This patch extends compatible_locations_p to require that range-printing of macro maps requires the location to either be both for the definition of the macro, or both for the arguments of the macro (not one of each), fixing the issue. gcc/ChangeLog: PR c/97932 * diagnostic-show-locus.c (compatible_locations_p): Require locations in the same macro map to be either both from the macro definition, or both from the macro arguments. gcc/testsuite/ChangeLog: PR c/97932 * gcc.dg/pr97932.c: New test. --- gcc/diagnostic-show-locus.c | 9 +++ gcc/testsuite/gcc.dg/pr97932.c | 125 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 134 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/pr97932.c (limited to 'gcc') diff --git a/gcc/diagnostic-show-locus.c b/gcc/diagnostic-show-locus.c index 92a07c2..458830a 100644 --- a/gcc/diagnostic-show-locus.c +++ b/gcc/diagnostic-show-locus.c @@ -905,6 +905,15 @@ compatible_locations_p (location_t loc_a, location_t loc_b) /* Are both within the same macro expansion? */ if (linemap_macro_expansion_map_p (map_a)) { + /* If so, then they're only compatible if either both are + from the macro definition, or both from the macro arguments. */ + bool loc_a_from_defn + = linemap_location_from_macro_definition_p (line_table, loc_a); + bool loc_b_from_defn + = linemap_location_from_macro_definition_p (line_table, loc_b); + if (loc_a_from_defn != loc_b_from_defn) + return false; + /* Expand each location towards the spelling location, and recurse. */ const line_map_macro *macro_map = linemap_check_macro (map_a); diff --git a/gcc/testsuite/gcc.dg/pr97932.c b/gcc/testsuite/gcc.dg/pr97932.c new file mode 100644 index 0000000..4a0b304 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr97932.c @@ -0,0 +1,125 @@ +/* Verify that we don't emit ranges that span both + a macro definition location and a macro expansion location. */ + +/* { dg-options "-fdiagnostics-show-caret" } */ + +/* Various cases involving the ranges of the LHS and RHS operands to "-". */ + +/* Case 1 + start token is in macro definition ("&"), + end token is in macro invocation ("a" and "b"). */ + +#define M1(A, B) &A - &B /* { dg-error "invalid operands" } */ + +/* Intervening + material + that + ought + not + to + be + printed. */ + +int test_1 (float a, int b) +{ + return M1(a, b); /* { dg-message "in expansion of macro 'M1'" } */ +} + +/* { dg-begin-multiline-output "" } + #define M1(A, B) &A - &B + ^ + { dg-end-multiline-output "" } */ +/* { dg-begin-multiline-output "" } + return M1(a, b); + ^~ + { dg-end-multiline-output "" } */ + +/* Case 2: + start and end tokens are both in macro invocation ("&", and "a"/"b"). */ + +#define M2(A, B) A - B /* { dg-error "invalid operands" } */ + +/* Intervening + material + that + ought + not + to + be + printed. */ + +int test_2 (float a, int b) +{ + return M2(&a, &b); /* { dg-message "in expansion of macro 'M2'" } */ +} + +/* { dg-begin-multiline-output "" } + #define M2(A, B) A - B + ^ + { dg-end-multiline-output "" } */ +/* { dg-begin-multiline-output "" } + return M2(&a, &b); + ^~ + { dg-end-multiline-output "" } */ + +/* Case 3: + start token is in macro invocation ("&"), + end token is in macro definition ("a"). */ + +#define M3(OP) OP a - OP b /* { dg-error "invalid operands" } */ + +/* Intervening + material + that + ought + not + to + be + printed. */ + +int test_3 (float a, int b) +{ + return M3(&); /* { dg-message "in expansion of macro 'M3'" } */ +} + +/* { dg-begin-multiline-output "" } + #define M3(OP) OP a - OP b + ^ + { dg-end-multiline-output "" } */ +/* { dg-begin-multiline-output "" } + return M3(&); + ^~ + { dg-end-multiline-output "" } */ + + +/* Case 4: + start and end tokens are both in macro definition ("&a"). */ + +#define M4 &a - &b /* { dg-error "invalid operands" } */ + +/* Intervening + material + that + ought + not + to + be + printed. */ + +int test_4 (float a, int b) +{ + return M4; /* { dg-message "in expansion of macro 'M4'" } */ +} + +/* { dg-begin-multiline-output "" } + #define M4 &a - &b + ~~ ^ ~~ + | | + | int * + float * + { dg-end-multiline-output "" } */ +/* { dg-begin-multiline-output "" } + return M4; + ^~ + { dg-end-multiline-output "" } */ + -- cgit v1.1 From 4e7c24d97dd65083a770252ce942f43d408fe11d Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Thu, 4 Feb 2021 11:46:45 -0500 Subject: c++: Empty args for variadic concept [PR98717] Nice when fixing a bug is as easy as removing incorrect checks. gcc/cp/ChangeLog: PR c++/98717 * constraint.cc (build_concept_check_arguments): Remove assert. (build_concept_check): Allow empty args. gcc/testsuite/ChangeLog: PR c++/98717 * g++.dg/cpp2a/concepts-variadic3.C: New test. --- gcc/cp/constraint.cc | 8 -------- gcc/testsuite/g++.dg/cpp2a/concepts-variadic3.C | 7 +++++++ 2 files changed, 7 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp2a/concepts-variadic3.C (limited to 'gcc') diff --git a/gcc/cp/constraint.cc b/gcc/cp/constraint.cc index 9049d08..31e0fb5 100644 --- a/gcc/cp/constraint.cc +++ b/gcc/cp/constraint.cc @@ -1345,7 +1345,6 @@ build_concept_check_arguments (tree arg, tree rest) } else { - gcc_assert (rest != NULL_TREE); args = rest; } return args; @@ -1444,13 +1443,6 @@ build_concept_check (tree target, tree args, tsubst_flags_t complain) tree build_concept_check (tree decl, tree arg, tree rest, tsubst_flags_t complain) { - if (arg == NULL_TREE && rest == NULL_TREE) - { - tree id = build_nt (TEMPLATE_ID_EXPR, decl, rest); - error ("invalid use concept %qE", id); - return error_mark_node; - } - tree args = build_concept_check_arguments (arg, rest); if (standard_concept_p (decl)) diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-variadic3.C b/gcc/testsuite/g++.dg/cpp2a/concepts-variadic3.C new file mode 100644 index 0000000..6fa7113 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-variadic3.C @@ -0,0 +1,7 @@ +// PR c++/98717 +// { dg-do compile { target c++20 } } + +template +concept True = true; + +static_assert(True<>); -- cgit v1.1 From ce5720447c69286599b96bae53ae854b1bbe41fa Mon Sep 17 00:00:00 2001 From: Martin Sebor Date: Thu, 4 Feb 2021 14:50:23 -0700 Subject: PR c/97882 - Segmentation Fault on improper redeclaration of function gcc/c/ChangeLog: PR c/97882 * c-decl.c (locate_old_decl): Add type to diagnostic output. (diagnose_mismatched_decls): Same. (start_function): Introduce temporaries for better readability. * c-typeck.c (comptypes_internal): Only consider complete enum types in comparisons with integers. gcc/testsuite/ChangeLog: PR c/97882 * gcc.dg/decl-8.c: Adjust text of expected diagnostic. * gcc.dg/label-decl-4.c: Same. * gcc.dg/mismatch-decl-1.c: Same. * gcc.dg/old-style-then-proto-1.c: Same. * gcc.dg/parm-mismatch-1.c: Same. * gcc.dg/pr35445.c: Same. * gcc.dg/redecl-11.c: Same. * gcc.dg/redecl-12.c: Same. * gcc.dg/redecl-13.c: Same. * gcc.dg/redecl-15.c: Same. * gcc.dg/tls/thr-init-1.c: Same. * objc.dg/id-1.m: Same. * objc.dg/tls/diag-3.m: Same. * gcc.dg/pr97882.c: New test. * gcc.dg/qual-return-7.c: New test. * gcc.dg/qual-return-8.c: New test. --- gcc/c/c-decl.c | 38 ++++--- gcc/c/c-typeck.c | 8 +- gcc/testsuite/gcc.dg/decl-8.c | 4 +- gcc/testsuite/gcc.dg/label-decl-4.c | 4 +- gcc/testsuite/gcc.dg/mismatch-decl-1.c | 10 +- gcc/testsuite/gcc.dg/old-style-then-proto-1.c | 18 ++-- gcc/testsuite/gcc.dg/parm-mismatch-1.c | 8 +- gcc/testsuite/gcc.dg/pr35445.c | 2 +- gcc/testsuite/gcc.dg/pr97882.c | 144 ++++++++++++++++++++++++++ gcc/testsuite/gcc.dg/qual-return-7.c | 18 ++++ gcc/testsuite/gcc.dg/qual-return-8.c | 28 +++++ gcc/testsuite/gcc.dg/redecl-11.c | 2 +- gcc/testsuite/gcc.dg/redecl-12.c | 2 +- gcc/testsuite/gcc.dg/redecl-13.c | 2 +- gcc/testsuite/gcc.dg/redecl-15.c | 2 +- gcc/testsuite/gcc.dg/tls/thr-init-1.c | 2 +- gcc/testsuite/objc.dg/id-1.m | 2 +- gcc/testsuite/objc.dg/tls/diag-3.m | 4 +- 18 files changed, 251 insertions(+), 47 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr97882.c create mode 100644 gcc/testsuite/gcc.dg/qual-return-7.c create mode 100644 gcc/testsuite/gcc.dg/qual-return-8.c (limited to 'gcc') diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c index be95643..a5852a3 100644 --- a/gcc/c/c-decl.c +++ b/gcc/c/c-decl.c @@ -1910,15 +1910,22 @@ validate_proto_after_old_defn (tree newdecl, tree newtype, tree oldtype) static void locate_old_decl (tree decl) { - if (TREE_CODE (decl) == FUNCTION_DECL && fndecl_built_in_p (decl) + if (TREE_CODE (decl) == FUNCTION_DECL + && fndecl_built_in_p (decl) && !C_DECL_DECLARED_BUILTIN (decl)) ; else if (DECL_INITIAL (decl)) - inform (input_location, "previous definition of %q+D was here", decl); + inform (input_location, + "previous definition of %q+D with type %qT", + decl, TREE_TYPE (decl)); else if (C_DECL_IMPLICIT (decl)) - inform (input_location, "previous implicit declaration of %q+D was here", decl); + inform (input_location, + "previous implicit declaration of %q+D with type %qT", + decl, TREE_TYPE (decl)); else - inform (input_location, "previous declaration of %q+D was here", decl); + inform (input_location, + "previous declaration of %q+D with type %qT", + decl, TREE_TYPE (decl)); } /* Subroutine of duplicate_decls. Compare NEWDECL to OLDDECL. @@ -2083,7 +2090,8 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl, && C_DECL_IMPLICIT (olddecl) && !DECL_INITIAL (olddecl)) { pedwarned = pedwarn (input_location, 0, - "conflicting types for %q+D", newdecl); + "conflicting types for %q+D; have %qT", + newdecl, newtype); /* Make sure we keep void as the return type. */ TREE_TYPE (olddecl) = *oldtypep = oldtype = newtype; } @@ -2119,7 +2127,7 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl, error ("conflicting type qualifiers for %q+D", newdecl); } else - error ("conflicting types for %q+D", newdecl); + error ("conflicting types for %q+D; have %qT", newdecl, newtype); diagnose_arglist_conflict (newdecl, olddecl, newtype, oldtype); locate_old_decl (olddecl); return false; @@ -9457,27 +9465,29 @@ start_function (struct c_declspecs *declspecs, struct c_declarator *declarator, current_function_prototype_locus = UNKNOWN_LOCATION; current_function_prototype_built_in = false; current_function_prototype_arg_types = NULL_TREE; - if (!prototype_p (TREE_TYPE (decl1))) + tree newtype = TREE_TYPE (decl1); + tree oldtype = old_decl ? TREE_TYPE (old_decl) : newtype; + if (!prototype_p (newtype)) { + tree oldrt = TREE_TYPE (oldtype); + tree newrt = TREE_TYPE (newtype); if (old_decl != NULL_TREE - && TREE_CODE (TREE_TYPE (old_decl)) == FUNCTION_TYPE - && comptypes (TREE_TYPE (TREE_TYPE (decl1)), - TREE_TYPE (TREE_TYPE (old_decl)))) + && TREE_CODE (oldtype) == FUNCTION_TYPE + && comptypes (oldrt, newrt)) { - if (stdarg_p (TREE_TYPE (old_decl))) + if (stdarg_p (oldtype)) { auto_diagnostic_group d; warning_at (loc, 0, "%q+D defined as variadic function " "without prototype", decl1); locate_old_decl (old_decl); } - TREE_TYPE (decl1) = composite_type (TREE_TYPE (old_decl), - TREE_TYPE (decl1)); + TREE_TYPE (decl1) = composite_type (oldtype, newtype); current_function_prototype_locus = DECL_SOURCE_LOCATION (old_decl); current_function_prototype_built_in = C_DECL_BUILTIN_PROTOTYPE (old_decl); current_function_prototype_arg_types - = TYPE_ARG_TYPES (TREE_TYPE (decl1)); + = TYPE_ARG_TYPES (newtype); } if (TREE_PUBLIC (decl1)) { diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c index 8ef0843..725dc51 100644 --- a/gcc/c/c-typeck.c +++ b/gcc/c/c-typeck.c @@ -1107,7 +1107,9 @@ comptypes_internal (const_tree type1, const_tree type2, bool *enum_and_int_p, not transitive: two enumerated types in the same translation unit are compatible with each other only if they are the same type. */ - if (TREE_CODE (t1) == ENUMERAL_TYPE && TREE_CODE (t2) != ENUMERAL_TYPE) + if (TREE_CODE (t1) == ENUMERAL_TYPE + && COMPLETE_TYPE_P (t1) + && TREE_CODE (t2) != ENUMERAL_TYPE) { t1 = c_common_type_for_size (TYPE_PRECISION (t1), TYPE_UNSIGNED (t1)); if (TREE_CODE (t2) != VOID_TYPE) @@ -1118,7 +1120,9 @@ comptypes_internal (const_tree type1, const_tree type2, bool *enum_and_int_p, *different_types_p = true; } } - else if (TREE_CODE (t2) == ENUMERAL_TYPE && TREE_CODE (t1) != ENUMERAL_TYPE) + else if (TREE_CODE (t2) == ENUMERAL_TYPE + && COMPLETE_TYPE_P (t2) + && TREE_CODE (t1) != ENUMERAL_TYPE) { t2 = c_common_type_for_size (TYPE_PRECISION (t2), TYPE_UNSIGNED (t2)); if (TREE_CODE (t1) != VOID_TYPE) diff --git a/gcc/testsuite/gcc.dg/decl-8.c b/gcc/testsuite/gcc.dg/decl-8.c index 485065b..608ff97 100644 --- a/gcc/testsuite/gcc.dg/decl-8.c +++ b/gcc/testsuite/gcc.dg/decl-8.c @@ -3,8 +3,8 @@ /* { dg-do compile } */ /* { dg-options "-std=gnu89 -pedantic-errors" } */ -typedef int I; /* { dg-message "note: previous declaration of 'I' was here" } */ +typedef int I; /* { dg-message "note: previous declaration of 'I'" "note" } */ typedef int I; /* { dg-error "redefinition of typedef 'I'" } */ -typedef int I1; /* { dg-message "note: previous declaration of 'I1' was here" } */ +typedef int I1; /* { dg-message "note: previous declaration of 'I1'" "note" } */ typedef long I1; /* { dg-error "conflicting types for 'I1'" } */ diff --git a/gcc/testsuite/gcc.dg/label-decl-4.c b/gcc/testsuite/gcc.dg/label-decl-4.c index 5661e01..82f1af0 100644 --- a/gcc/testsuite/gcc.dg/label-decl-4.c +++ b/gcc/testsuite/gcc.dg/label-decl-4.c @@ -7,8 +7,8 @@ void f (void) { __label__ a, b, a; /* { dg-error "duplicate label declaration 'a'" } */ - /* { dg-message "note: previous declaration of 'a' was here" "previous" { target *-*-* } .-1 } */ - __label__ c; /* { dg-message "note: previous declaration of 'c' was here" } */ + /* { dg-message "note: previous declaration of 'a'" "previous" { target *-*-* } .-1 } */ + __label__ c; /* { dg-message "note: previous declaration of 'c'" "note" } */ __label__ c; /* { dg-error "duplicate label declaration 'c'" } */ return; } diff --git a/gcc/testsuite/gcc.dg/mismatch-decl-1.c b/gcc/testsuite/gcc.dg/mismatch-decl-1.c index da4db0a..b6dd543 100644 --- a/gcc/testsuite/gcc.dg/mismatch-decl-1.c +++ b/gcc/testsuite/gcc.dg/mismatch-decl-1.c @@ -4,12 +4,12 @@ /* The bug this is testing is that if a new decl conflicts with an explicit decl, you don't get the "changes type of builtin" message, - but if there was *also* a builtin, you *also* don't get the - "previous declaration was here" message, leaving you with no clue - where the previous declaration came from. */ + but if there was *also* a builtin, you *also* don't get the "previous + declaration" message, leaving you with no clue where the previous + declaration came from. */ -extern char foo(int,int); /* { dg-message "previous declaration of 'foo' was here" } */ -extern char *index(const char *,int); /* { dg-message "previous declaration of 'index' was here" } */ +extern char foo(int,int); /* { dg-message "previous declaration of 'foo'" "note" } */ +extern char *index(const char *,int); /* { dg-message "previous declaration of 'index'" "note" } */ /* This changes the type of "index", which is both a builtin and an explicit decl. */ diff --git a/gcc/testsuite/gcc.dg/old-style-then-proto-1.c b/gcc/testsuite/gcc.dg/old-style-then-proto-1.c index 7d76287..e3e6186 100644 --- a/gcc/testsuite/gcc.dg/old-style-then-proto-1.c +++ b/gcc/testsuite/gcc.dg/old-style-then-proto-1.c @@ -7,38 +7,38 @@ void f1() {} void f1(void); /* { dg-warning "prototype for 'f1' follows non-prototype definition" } */ -void f2() {} /* { dg-message "note: previous definition of 'f2' was here" } */ +void f2() {} /* { dg-message "note: previous definition of 'f2'" "note" } */ void f2(int); /* { dg-error "prototype for 'f2' declares more arguments than previous old-style definition" } */ -void f3(a) int a; {} /* { dg-message "note: previous definition of 'f3' was here" } */ +void f3(a) int a; {} /* { dg-message "note: previous definition of 'f3'" "note" } */ void f3(void); /* { dg-error "prototype for 'f3' declares fewer arguments than previous old-style definition" } */ void f4(a) int a; {} void f4(int); /* { dg-warning "prototype for 'f4' follows non-prototype definition" } */ -void f5(a) int a; {} /* { dg-message "note: previous definition of 'f5' was here" } */ +void f5(a) int a; {} /* { dg-message "note: previous definition of 'f5'" "note" } */ void f5(int, int); /* { dg-error "prototype for 'f5' declares more arguments than previous old-style definition" } */ -void f6(a) int a; {} /* { dg-message "note: previous definition of 'f6' was here" } */ +void f6(a) int a; {} /* { dg-message "note: previous definition of 'f6'" "note" } */ void f6(int, ...); /* { dg-error "conflicting types for 'f6'" } */ -void f7(a, b) int a, b; {} /* { dg-message "note: previous definition of 'f7' was here" } */ +void f7(a, b) int a, b; {} /* { dg-message "note: previous definition of 'f7'" "note" } */ void f7(int); /* { dg-error "prototype for 'f7' declares fewer arguments than previous old-style definition" } */ -void f8(a, b) int a, b; {} /* { dg-message "note: previous definition of 'f8' was here" } */ +void f8(a, b) int a, b; {} /* { dg-message "note: previous definition of 'f8'" "note" } */ void f8(int, ...); /* { dg-error "conflicting types for 'f8'" } */ void f9(a, b) int a, b; {} void f9(int, int); /* { dg-warning "prototype for 'f9' follows non-prototype definition" } */ -void f10(a, b) int a, b; {} /* { dg-message "note: previous definition of 'f10' was here" } */ +void f10(a, b) int a, b; {} /* { dg-message "note: previous definition of 'f10'" "note" } */ void f10(int, long); /* { dg-error "prototype for 'f10' declares argument 2 with incompatible type" } */ -void f11(a, b) int a, b; {} /* { dg-message "note: previous definition of 'f11' was here" } */ +void f11(a, b) int a, b; {} /* { dg-message "note: previous definition of 'f11'" "note" } */ void f11(long, int); /* { dg-error "prototype for 'f11' declares argument 1 with incompatible type" } */ void f12(a, b) const int a; volatile int b; {} void f12(volatile int, const int); /* { dg-warning "prototype for 'f12' follows non-prototype definition" } */ -void f13(a) const int a[2][2]; {} /* { dg-message "note: previous definition of 'f13' was here" } */ +void f13(a) const int a[2][2]; {} /* { dg-message "note: previous definition of 'f13'" "note" } */ void f13(volatile int [2][2]); /* { dg-error "prototype for 'f13' declares argument 1 with incompatible type" } */ diff --git a/gcc/testsuite/gcc.dg/parm-mismatch-1.c b/gcc/testsuite/gcc.dg/parm-mismatch-1.c index 058f2e8..d7621bc 100644 --- a/gcc/testsuite/gcc.dg/parm-mismatch-1.c +++ b/gcc/testsuite/gcc.dg/parm-mismatch-1.c @@ -4,15 +4,15 @@ /* { dg-do compile } */ /* { dg-options "" } */ -void f0(); /* { dg-message "note: previous declaration of 'f0' was here" } */ +void f0(); /* { dg-message "note: previous declaration of 'f0'" "note" } */ void f0(int, ...); /* { dg-error "conflicting types for 'f0'" } */ /* { dg-message "note: a parameter list with an ellipsis cannot match an empty parameter name list declaration" "note" { target *-*-* } .-1 } */ -void f1(int, ...); /* { dg-message "note: previous declaration of 'f1' was here" } */ +void f1(int, ...); /* { dg-message "note: previous declaration of 'f1'" "note" } */ void f1(); /* { dg-error "conflicting types for 'f1'" } */ /* { dg-message "note: a parameter list with an ellipsis cannot match an empty parameter name list declaration" "note" { target *-*-* } .-1 } */ -void f2(); /* { dg-message "note: previous declaration of 'f2' was here" } */ +void f2(); /* { dg-message "note: previous declaration of 'f2'" "note" } */ void f2(char); /* { dg-error "conflicting types for 'f2'" } */ /* { dg-message "note: an argument type that has a default promotion cannot match an empty parameter name list declaration" "note" { target *-*-* } .-1 } */ -void f3(char); /* { dg-message "note: previous declaration of 'f3' was here" } */ +void f3(char); /* { dg-message "note: previous declaration of 'f3'" "note" } */ void f3(); /* { dg-error "conflicting types for 'f3'" } */ /* { dg-message "note: an argument type that has a default promotion cannot match an empty parameter name list declaration" "note" { target *-*-* } .-1 } */ diff --git a/gcc/testsuite/gcc.dg/pr35445.c b/gcc/testsuite/gcc.dg/pr35445.c index 56ca6e2..30c29f4 100644 --- a/gcc/testsuite/gcc.dg/pr35445.c +++ b/gcc/testsuite/gcc.dg/pr35445.c @@ -2,5 +2,5 @@ /* { dg-do compile } */ extern int i; -extern int i; /* { dg-message "was here" } */ +extern int i; /* { dg-message "previous declaration of 'i'" } */ int i[] = { 0 }; /* { dg-error "conflicting types" } */ diff --git a/gcc/testsuite/gcc.dg/pr97882.c b/gcc/testsuite/gcc.dg/pr97882.c new file mode 100644 index 0000000..48ea93d --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr97882.c @@ -0,0 +1,144 @@ +/* PR c/97882 - Segmentation Fault on improper redeclaration of function + { dg-do compile } + { dg-options "" } */ + +// Check pointer declaration incompatibiliies. + +extern enum E e_u; // { dg-message "note: previous declaration of 'e_u' with type 'enum E'" "note" } +unsigned e_u; // { dg-error "conflicting types for 'e_u'; have 'unsigned int'" } + + +extern enum E *p; // { dg-message "note: previous declaration of 'p' with type 'enum E \\*'" "note" } +unsigned *p; // { dg-error "conflicting types for 'p'; have 'unsigned int \\*'" } + +extern enum E **p2; // { dg-message "note: previous declaration of 'p2' with type 'enum E \\*\\*'" "note" } +unsigned **p2; // { dg-error "conflicting types for 'p2'; have 'unsigned int \\*\\*'" } + +extern enum E ***p3; // { dg-message "note: previous declaration of 'p3' with type 'enum E \\*\\*\\*'" "note" } +unsigned ***p3; // { dg-error "conflicting types for 'p3'; have 'unsigned int \\*\\*\\*'" } + +extern enum F *q; // { dg-message "note: previous declaration of 'q' with type 'enum F \\*'" "note" } +int *q; // { dg-error "conflicting types for 'q'; have 'int \\*'" } + +extern enum E* r[]; // { dg-message "note: previous declaration of 'r' with type 'enum E \\*\\\[]'" "note" } +extern unsigned *r[1]; // { dg-error "conflicting types for 'r'; have 'unsigned int \\*\\\[1]'" } + +extern enum E **r2[]; // { dg-message "note: previous declaration of 'r2' with type 'enum E \\*\\*\\\[]'" "note" } +extern unsigned **r2[2];// { dg-error "conflicting types for 'r2'; have 'unsigned int \\*\\*\\\[2]'" } + + +typedef enum E* EPAx[]; +typedef unsigned* UPAx[]; + +extern EPAx* peax; // { dg-message "note: previous declaration of 'peax' with type 'enum E \\* \\(\\*\\)\\\[]'" "note" } +extern UPAx* peax; // { dg-error "conflicting types for 'peax'; have 'unsigned int \\* \\(\\*\\)\\\[]'" } + + +/* Check incompatibilities in the return type in a redeclaration + of a function without a prototye. */ + +/* Verify the following isn't rejected. */ +void f_v (); +void f_v (void); + +enum E fE_u (); // { dg-message "previous declaration of 'fE_u' with type 'enum E\\(\\)'" "note" } +unsigned fE_u (); // { dg-error "conflicting types for 'fE_u'; have 'unsigned int\\(\\)'" } + +enum E* fpE_u (); // { dg-message "previous declaration of 'fpE_u' with type 'enum E \\*\\(\\)'" "note" } +unsigned* fpE_u (); // { dg-error "conflicting types for 'fpE_u'; have 'unsigned int \\*\\(\\)'" } + +enum E** fppE_u (); // { dg-message "previous declaration of 'fppE_u' with type 'enum E \\*\\*\\(\\)'" "note" } +unsigned** fppE_u (); // { dg-error "conflicting types for 'fppE_u'; have 'unsigned int \\*\\*\\(\\)'" } + +enum E** fppE_u (); // { dg-message "previous declaration of 'fppE_u' with type 'enum E \\*\\*\\(\\)'" "note" } +unsigned** fppE_u (); // { dg-error "conflicting types for 'fppE_u'; have 'unsigned int \\*\\*\\(\\)'" } + +enum E gE_u (); // { dg-message "previous declaration of 'gE_u' with type 'enum E\\(\\)'" "note" } +unsigned gE_u () // { dg-error "conflicting types for 'gE_u'; have 'unsigned int\\(\\)'" } +{ return 0; } + +enum E** gppE_u (); // { dg-message "previous declaration of 'gppE_u' with type 'enum E \\*\\*\\(\\)'" "note" } +unsigned** gppE_u () // { dg-error "conflicting types for 'gppE_u'; have 'unsigned int \\*\\*\\(\\)'" } +{ return 0; } + +unsigned fu_E (); // { dg-message "previous declaration of 'fu_E' with type 'unsigned int\\(\\)'" "note" } +enum E fu_E (); // { dg-error "conflicting types for 'fu_E'; have 'enum E\\(\\)'" } + +unsigned gu_E (); // { dg-message "previous declaration of 'gu_E' with type 'unsigned int\\(\\)'" "note" } +enum E gu_E () { } // { dg-error "conflicting types for 'gu_E'" } + // { dg-error "incomplete type" "return type" { target *-*-* } .-1 } + +typedef enum E FE_ (); +typedef unsigned Fuv (void); + +FE_* fpF_u (); // // { dg-message "previous declaration of 'fpF_u' with type 'enum E \\(\\*\\(\\)\\)\\(\\)'" "note" } +Fuv* fpF_u (); // { dg-error "conflicting types for 'fpF_u'; have 'unsigned int \\(\\*\\(\\)\\)\\(void\\)'" } + + +typedef void Fv_ (); +typedef void Fvv (void); + +/* Verify the following isn't rejected. */ +Fv_* f (); +Fvv* f (); + + +/* Check incompatibilities in argument types of a function redeclaration. */ + +void fvE_u (enum E); // { dg-message "note: previous declaration of 'fvE_u' with type 'void\\(enum E\\)'" "note" } +void fvE_u (unsigned); // { dg-error "conflicting types for 'fvE_u'; have 'void\\(unsigned int\\)'" } + +void fviE_u (int, enum E); // { dg-message "note: previous declaration of 'fviE_u' with type 'void\\(int, *enum E\\)'" "note" } +void fviE_u (int, unsigned); // { dg-error "conflicting types for 'fviE_u'; have 'void\\(int, *unsigned int\\)'" } + +void fvE_el (enum E, ...); // { dg-message "note: previous declaration of 'fvE_el' with type 'void\\(enum E, \\.\\.\\.\\)'" "note" } +void fvE_el (unsigned, ...); // { dg-error "conflicting types for 'fvE_el'; have 'void\\(unsigned int, \\.\\.\\.\\)'" } + + +/* Check incompatibilities in the return type in a redeclaration + of a nested function without a prototye. */ + +void f1 (void) +{ + enum G f11 (); // { dg-message "note: previous declaration of 'f11' with type 'enum G\\(\\)'" "note" } + unsigned f11 () { } // { dg-error "conflicting types for 'f11'; have 'unsigned int\\(\\)'" } +} + + +void f2 (void) +{ + const enum G f21 (); // { dg-message "note: previous declaration of 'f21' with type 'enum G\\(\\)'" "note" } + unsigned f21 () { } // { dg-error "conflicting types for 'f21'; have 'unsigned int\\(\\)'" } +} + + +void f3 (void) +{ + enum G f31 (); // { dg-message "note: previous declaration of 'f31' with type 'enum G\\(\\)'" "note" } + const unsigned f31 () { } // { dg-error "conflicting types for 'f31'; have 'unsigned int\\(\\)'" } +} + + +void f4 (void) +{ + auto enum G f31 (); // { dg-message "note: previous declaration of 'f31' with type 'enum G\\(\\)'" "note" } + const unsigned f31 () { } // { dg-error "conflicting types for 'f31'; have 'unsigned int\\(\\)'" } +} + + +void f5 (void) +{ + enum G* f51 (); // { dg-message "note: previous declaration of 'f51' with type 'enum G \\*\\(\\)'" "note" } + int* f51 () { } // { dg-error "conflicting types for 'f51'; have 'int \\*\\(\\)'" } +} + + +void f6 (void) +{ + enum G; + void f61 (enum G); // { dg-message "note: previous declaration of 'f61' with type 'void\\(enum G\\)'" "note" } + void f61 (unsigned) // { dg-error "conflicting types for 'f61'; have 'void\\(unsigned int\\)'" } + { } +} + +// { dg-prune-output "nested function '\[^\n\r ]+' declared but never defined" } diff --git a/gcc/testsuite/gcc.dg/qual-return-7.c b/gcc/testsuite/gcc.dg/qual-return-7.c new file mode 100644 index 0000000..96f7f16 --- /dev/null +++ b/gcc/testsuite/gcc.dg/qual-return-7.c @@ -0,0 +1,18 @@ +/* Same as qual-return-3.c but with nested functions. + { dg-do compile } + { dg-options "-std=gnu99" } */ + +void test_local (void) +{ + auto int foo (); /* { dg-message "note: previous declaration" "different qualifiers" } */ + + const int foo () { return 0; } /* { dg-error "conflicting types" "different qualifiers" } */ + + auto void bar (void); + volatile void bar () { } /* { dg-warning "qualified|volatile" "different qualifiers" } */ + + auto volatile void baz (void); + void baz () { } /* { dg-warning "not compatible" "different qualifiers" } */ +} + +/* { dg-prune-output "nested function 'foo' declared but never defined" } */ diff --git a/gcc/testsuite/gcc.dg/qual-return-8.c b/gcc/testsuite/gcc.dg/qual-return-8.c new file mode 100644 index 0000000..de1e7cb --- /dev/null +++ b/gcc/testsuite/gcc.dg/qual-return-8.c @@ -0,0 +1,28 @@ +/* Same as qual-return-7.c but in C11 mode. + { dg-do compile } + { dg-options "-std=gnu11" } */ + +void test_local (void) +{ +#if 0 + /* _Atomic is not considered a qualifier and so is not ignored + on a return type. As a result, the redeclaration below isn't + valid. See also qual-return-5.c. */ + auto int fi_ai (); + _Atomic int fi_ai () { return 0; } +#endif + + auto int fi_ci (); + const int fi_ci () { return 0; } + + auto enum E fe_ce (); + + enum E { e }; + const enum E fe_ce () { return 0; } + + auto void fv_vv (void); + volatile void fv_vv () { } + + auto volatile void fvv_v (void); + void fvv_v () { } +} diff --git a/gcc/testsuite/gcc.dg/redecl-11.c b/gcc/testsuite/gcc.dg/redecl-11.c index 5540e40..3c6f64f 100644 --- a/gcc/testsuite/gcc.dg/redecl-11.c +++ b/gcc/testsuite/gcc.dg/redecl-11.c @@ -5,5 +5,5 @@ /* { dg-options "" } */ int f(int (*)[]); -void g() { int f(int (*)[2]); } /* { dg-message "note: previous declaration of 'f' was here" } */ +void g() { int f(int (*)[2]); } /* { dg-message "note: previous declaration of 'f'" "note" } */ int f(int (*)[3]); /* { dg-error "conflicting types for 'f'" } */ diff --git a/gcc/testsuite/gcc.dg/redecl-12.c b/gcc/testsuite/gcc.dg/redecl-12.c index 711b8a3..9922cf4 100644 --- a/gcc/testsuite/gcc.dg/redecl-12.c +++ b/gcc/testsuite/gcc.dg/redecl-12.c @@ -5,5 +5,5 @@ /* { dg-options "" } */ extern int a[]; -void f(void) { extern int a[]; extern int a[10]; } /* { dg-message "note: previous declaration of 'a' was here" } */ +void f(void) { extern int a[]; extern int a[10]; } /* { dg-message "note: previous declaration of 'a'" "note" } */ extern int a[5]; /* { dg-error "conflicting types for 'a'" } */ diff --git a/gcc/testsuite/gcc.dg/redecl-13.c b/gcc/testsuite/gcc.dg/redecl-13.c index 3f05d0f..556a3cd 100644 --- a/gcc/testsuite/gcc.dg/redecl-13.c +++ b/gcc/testsuite/gcc.dg/redecl-13.c @@ -5,5 +5,5 @@ /* { dg-options "" } */ extern int a[]; -void f(void) { extern int a[10]; } /* { dg-message "note: previous declaration of 'a' was here" } */ +void f(void) { extern int a[10]; } /* { dg-message "note: previous declaration of 'a'" "note" } */ extern int a[5]; /* { dg-error "conflicting types for 'a'" } */ diff --git a/gcc/testsuite/gcc.dg/redecl-15.c b/gcc/testsuite/gcc.dg/redecl-15.c index ff484c9..06d6523 100644 --- a/gcc/testsuite/gcc.dg/redecl-15.c +++ b/gcc/testsuite/gcc.dg/redecl-15.c @@ -7,7 +7,7 @@ void f (void) { - g(); /* { dg-message "note: previous implicit declaration of 'g' was here" } */ + g(); /* { dg-message "note: previous implicit declaration of 'g'" } */ { void g(); /* { dg-warning "conflicting types for 'g'" } */ } diff --git a/gcc/testsuite/gcc.dg/tls/thr-init-1.c b/gcc/testsuite/gcc.dg/tls/thr-init-1.c index a9b6061..af51484 100644 --- a/gcc/testsuite/gcc.dg/tls/thr-init-1.c +++ b/gcc/testsuite/gcc.dg/tls/thr-init-1.c @@ -6,4 +6,4 @@ static __thread int fstat = 1 ; /* { dg-line fstat_prev } */ static __thread int fstat ; static __thread int fstat = 2; /* { dg-error "redefinition of 'fstat'" "" { target *-*-* } .-1 } */ -/* { dg-message "note: previous definition of 'fstat' was here" "" { target *-*-* } fstat_prev } */ +/* { dg-message "note: previous definition of 'fstat'" "note" { target *-*-* } fstat_prev } */ diff --git a/gcc/testsuite/objc.dg/id-1.m b/gcc/testsuite/objc.dg/id-1.m index 2bfcc63..271dbe6 100644 --- a/gcc/testsuite/objc.dg/id-1.m +++ b/gcc/testsuite/objc.dg/id-1.m @@ -2,6 +2,6 @@ /* { dg-do compile } */ typedef int id; /* { dg-error "conflicting types for .id." } */ -/* { dg-message "previous declaration of .id. was here" "" { target *-*-* } 0 } */ +/* { dg-message "previous declaration of .id." "" { target *-*-* } 0 } */ id b; diff --git a/gcc/testsuite/objc.dg/tls/diag-3.m b/gcc/testsuite/objc.dg/tls/diag-3.m index c71f66f..b39d565 100644 --- a/gcc/testsuite/objc.dg/tls/diag-3.m +++ b/gcc/testsuite/objc.dg/tls/diag-3.m @@ -1,10 +1,10 @@ /* Report invalid extern and __thread combinations. */ /* { dg-require-effective-target tls } */ -extern int j; /* { dg-message "previous declaration of 'j' was here" } */ +extern int j; /* { dg-message "previous declaration of 'j'" } */ __thread int j; /* { dg-error "follows non-thread-local" } */ -extern __thread int i; /* { dg-message "previous declaration of 'i' was here" } */ +extern __thread int i; /* { dg-message "previous declaration of 'i'" } */ int i; /* { dg-error "follows thread-local" } */ extern __thread int k; /* This is fine. */ -- cgit v1.1 From c1d56e6a737418b7b48a53b355f588ea14f1b9a9 Mon Sep 17 00:00:00 2001 From: Iain Buclaw Date: Thu, 4 Feb 2021 22:34:22 +0100 Subject: d: Merge upstream dmd 46133f761, druntime 0fd4364c D front-end changes: - Backported built-in function handling from upstream. - Added new intrinsic `byteswap(ushort)`. Druntime changes: - Update intrinsic modules core.bitop, core.checkedint, core.simd, core.vararg, and core.volatile. - Backport platform-specific fixes for runtime modules core.cpuid, core.internal.traits, and rt.lifetime. - Backport openbsd fixes for core.stdc.stdio. - Backport solaris fixes for core.sys.posix.locale, and core.thread.osthread (PR98910). gcc/d/ChangeLog: * dmd/MERGE: Merge upstream dmd 46133f761. * d-builtins.cc (d_build_builtins_module): Set builtins as BUILTINgcc. (maybe_set_builtin_1): Likewise. * d-frontend.cc (eval_builtin): Adjust condition for early return. * intrinsics.cc (maybe_set_intrinsic): Set intrinsics as BUILTINgcc. (maybe_expand_intrinsic): Add case for INTRINSIC_BSWAP16. * intrinsics.def (INTRINSIC_BT): Update signature. (INTRINSIC_BT64): Likewise. (INTRINSIC_BSWAP16): New intrinsic. (INTRINSIC_VLOAD8): Update module. (INTRINSIC_VLOAD16): Likewise. (INTRINSIC_VLOAD32): Likewise. (INTRINSIC_VLOAD64): Likewise. (INTRINSIC_VSTORE8): Likewise. (INTRINSIC_VSTORE16): Likewise. (INTRINSIC_VSTORE32): Likewise. (INTRINSIC_VSTORE64): Likewise. (INTRINSIC_ADDS): Update signature. (INTRINSIC_ADDSL): Likewise. (INTRINSIC_ADDU): Likewise. (INTRINSIC_ADDUL): Likewise. (INTRINSIC_SUBS): Likewise. (INTRINSIC_SUBSL): Likewise. (INTRINSIC_SUBU): Likewise. (INTRINSIC_SUBUL): Likewise. (INTRINSIC_MULS): Likewise. (INTRINSIC_MULSL): Likewise. (INTRINSIC_MULU): Likewise. (INTRINSIC_MULUI): Likewise. (INTRINSIC_MULUL): Likewise. (INTRINSIC_NEGS): Likewise. (INTRINSIC_NEGSL): Likewise. libphobos/ChangeLog: PR d/98910 * libdruntime/MERGE: Merge upstream druntime 0fd4364c. * libdruntime/Makefile.am (DRUNTIME_DSOURCES): Add core/volatile.d. * libdruntime/Makefile.in: Regenerate. * testsuite/libphobos.allocations/tls_gc_integration.d: Update test. gcc/testsuite/ChangeLog: * gdc.dg/intrinsics.d: Update test. --- gcc/d/d-builtins.cc | 4 +-- gcc/d/d-frontend.cc | 2 +- gcc/d/dmd/MERGE | 2 +- gcc/d/dmd/declaration.h | 40 ++++++++++++++++++++++++++--- gcc/d/dmd/dinterpret.c | 2 +- gcc/d/dmd/idgen.c | 38 ++++++++++++++++++++++++++++ gcc/d/dmd/root/ctfloat.h | 18 +++++++++++++ gcc/d/intrinsics.cc | 7 +++--- gcc/d/intrinsics.def | 53 +++++++++++++++++++++------------------ gcc/testsuite/gdc.dg/intrinsics.d | 3 +++ 10 files changed, 133 insertions(+), 36 deletions(-) (limited to 'gcc') diff --git a/gcc/d/d-builtins.cc b/gcc/d/d-builtins.cc index 3f1533b..c45edc2 100644 --- a/gcc/d/d-builtins.cc +++ b/gcc/d/d-builtins.cc @@ -566,7 +566,7 @@ d_build_builtins_module (Module *m) STCextern, tf); DECL_LANG_SPECIFIC (decl) = build_lang_decl (func); func->csym = decl; - func->builtin = BUILTINyes; + func->builtin = BUILTINgcc; members->push (func); } @@ -706,7 +706,7 @@ maybe_set_builtin_1 (Dsymbol *d) /* Found a match, tell the frontend this is a builtin. */ DECL_LANG_SPECIFIC (t) = build_lang_decl (fd); fd->csym = t; - fd->builtin = BUILTINyes; + fd->builtin = BUILTINgcc; return; } } diff --git a/gcc/d/d-frontend.cc b/gcc/d/d-frontend.cc index 32550ec..84c70f8 100644 --- a/gcc/d/d-frontend.cc +++ b/gcc/d/d-frontend.cc @@ -158,7 +158,7 @@ isBuiltin (FuncDeclaration *fd) Expression * eval_builtin (Loc loc, FuncDeclaration *fd, Expressions *arguments) { - if (fd->builtin != BUILTINyes) + if (fd->builtin == BUILTINunimp) return NULL; tree decl = get_symbol_decl (fd); diff --git a/gcc/d/dmd/MERGE b/gcc/d/dmd/MERGE index 342871f..89397c8 100644 --- a/gcc/d/dmd/MERGE +++ b/gcc/d/dmd/MERGE @@ -1,4 +1,4 @@ -5e2a81d9cbcd653d9eed52344d664e72ba1355bc +46133f76172c26c89e2ebf9cd058cd1f1e8807ed The first line of this file holds the git revision number of the last merge done from the dlang/dmd repository. diff --git a/gcc/d/dmd/declaration.h b/gcc/d/dmd/declaration.h index a464f9b..6a3ec9e 100644 --- a/gcc/d/dmd/declaration.h +++ b/gcc/d/dmd/declaration.h @@ -503,9 +503,43 @@ enum ILS enum BUILTIN { - BUILTINunknown = -1, // not known if this is a builtin - BUILTINno, // this is not a builtin - BUILTINyes // this is a builtin + BUILTINunknown = 255, /// not known if this is a builtin + BUILTINunimp = 0, /// this is not a builtin + BUILTINgcc, /// this is a GCC builtin + BUILTINllvm, /// this is an LLVM builtin + BUILTINsin, + BUILTINcos, + BUILTINtan, + BUILTINsqrt, + BUILTINfabs, + BUILTINldexp, + BUILTINlog, + BUILTINlog2, + BUILTINlog10, + BUILTINexp, + BUILTINexpm1, + BUILTINexp2, + BUILTINround, + BUILTINfloor, + BUILTINceil, + BUILTINtrunc, + BUILTINcopysign, + BUILTINpow, + BUILTINfmin, + BUILTINfmax, + BUILTINfma, + BUILTINisnan, + BUILTINisinfinity, + BUILTINisfinite, + BUILTINbsf, + BUILTINbsr, + BUILTINbswap, + BUILTINpopcnt, + BUILTINyl2x, + BUILTINyl2xp1, + BUILTINtoPrecFloat, + BUILTINtoPrecDouble, + BUILTINtoPrecReal }; Expression *eval_builtin(Loc loc, FuncDeclaration *fd, Expressions *arguments); diff --git a/gcc/d/dmd/dinterpret.c b/gcc/d/dmd/dinterpret.c index 74c5b40..f868790 100644 --- a/gcc/d/dmd/dinterpret.c +++ b/gcc/d/dmd/dinterpret.c @@ -6801,7 +6801,7 @@ Expression *evaluateIfBuiltin(UnionExp *pue, InterState *istate, Loc loc, size_t nargs = arguments ? arguments->length : 0; if (!pthis) { - if (isBuiltin(fd) == BUILTINyes) + if (isBuiltin(fd) != BUILTINunimp) { Expressions args; args.setDim(nargs); diff --git a/gcc/d/dmd/idgen.c b/gcc/d/dmd/idgen.c index 09855a0..322a293 100644 --- a/gcc/d/dmd/idgen.c +++ b/gcc/d/dmd/idgen.c @@ -291,6 +291,8 @@ Msgtable msgtable[] = { "entrypoint", "__entrypoint" }, // varargs implementation + { "stdc", NULL }, + { "stdarg", NULL }, { "va_start", NULL }, // Builtin functions @@ -304,16 +306,52 @@ Msgtable msgtable[] = { "_sqrt", "sqrt" }, { "_pow", "pow" }, { "atan2", NULL }, + { "rint", NULL }, + { "ldexp", NULL }, { "rndtol", NULL }, + { "exp", NULL }, { "expm1", NULL }, { "exp2", NULL }, { "yl2x", NULL }, { "yl2xp1", NULL }, + { "log", NULL }, + { "log2", NULL }, + { "log10", NULL }, + { "round", NULL }, + { "floor", NULL }, + { "trunc", NULL }, + { "fmax", NULL }, + { "fmin", NULL }, + { "fma", NULL }, + { "isnan", NULL }, + { "isInfinity", NULL }, + { "isfinite", NULL }, + { "ceil", NULL }, + { "copysign", NULL }, { "fabs", NULL }, + { "toPrec", NULL }, + { "simd", NULL }, + { "__prefetch", NULL }, + { "__simd_sto", NULL }, + { "__simd", NULL }, + { "__simd_ib", NULL }, { "bitop", NULL }, { "bsf", NULL }, { "bsr", NULL }, + { "btc", NULL }, + { "btr", NULL }, + { "bts", NULL }, { "bswap", NULL }, + { "_volatile", "volatile" }, + { "volatileLoad", NULL }, + { "volatileStore", NULL }, + { "_popcnt", NULL }, + { "inp", NULL }, + { "inpl", NULL }, + { "inpw", NULL }, + { "outp", NULL }, + { "outpl", NULL }, + { "outpw", NULL }, // Traits { "isAbstractClass", NULL }, diff --git a/gcc/d/dmd/root/ctfloat.h b/gcc/d/dmd/root/ctfloat.h index c72b8fc..4cdf362 100644 --- a/gcc/d/dmd/root/ctfloat.h +++ b/gcc/d/dmd/root/ctfloat.h @@ -29,6 +29,24 @@ struct CTFloat static real_t fabs(real_t x); static real_t ldexp(real_t n, int exp); + static real_t round(real_t x); + static real_t floor(real_t x); + static real_t ceil(real_t x); + static real_t trunc(real_t x); + static real_t log(real_t x); + static real_t log2(real_t x); + static real_t log10(real_t x); + static real_t pow(real_t x, real_t y); + static real_t exp(real_t x); + static real_t expm1(real_t x); + static real_t exp2(real_t x); + + static real_t fmin(real_t x, real_t y); + static real_t fmax(real_t x, real_t y); + static real_t copysign(real_t x, real_t s); + + static real_t fma(real_t x, real_t y, real_t z); + static bool isIdentical(real_t a, real_t b); static bool isNaN(real_t r); static bool isSNaN(real_t r); diff --git a/gcc/d/intrinsics.cc b/gcc/d/intrinsics.cc index 70c9850..7f97c1d 100644 --- a/gcc/d/intrinsics.cc +++ b/gcc/d/intrinsics.cc @@ -81,7 +81,7 @@ maybe_set_intrinsic (FuncDeclaration *decl) /* The builtin flag is updated only if we can evaluate the intrinsic at compile-time. Such as the math or bitop intrinsics. */ - decl->builtin = BUILTINno; + decl->builtin = BUILTINunimp; /* Check if it's a compiler intrinsic. We only require that any internally recognised intrinsics are declared in a module with @@ -177,12 +177,12 @@ maybe_set_intrinsic (FuncDeclaration *decl) built-in function. It could be `int pow(int, int)'. */ tree rettype = TREE_TYPE (TREE_TYPE (decl->csym)); if (mathfn_built_in (rettype, BUILT_IN_POW) != NULL_TREE) - decl->builtin = BUILTINyes; + decl->builtin = BUILTINgcc; break; } default: - decl->builtin = BUILTINyes; + decl->builtin = BUILTINgcc; break; } @@ -809,6 +809,7 @@ maybe_expand_intrinsic (tree callexp) case INTRINSIC_ROR_TIARG: return expand_intrinsic_rotate (intrinsic, callexp); + case INTRINSIC_BSWAP16: case INTRINSIC_BSWAP32: case INTRINSIC_BSWAP64: case INTRINSIC_CEIL: diff --git a/gcc/d/intrinsics.def b/gcc/d/intrinsics.def index e44843e..dc6b104 100644 --- a/gcc/d/intrinsics.def +++ b/gcc/d/intrinsics.def @@ -42,17 +42,18 @@ DEF_D_BUILTIN (NONE, NONE, 0, 0, 0) DEF_D_BUILTIN (BSF, NONE, "bsf", "core.bitop", "FNaNbNiNfkZi") DEF_D_BUILTIN (BSR, NONE, "bsr", "core.bitop", "FNaNbNiNfkZi") -DEF_D_BUILTIN (BT, NONE, "bt", "core.bitop", "FNaNbNixPkkZi") +DEF_D_BUILTIN (BT, NONE, "bt", "core.bitop", "FNaNbNiMxPkkZi") DEF_D_BUILTIN (BTC, NONE, "btc", "core.bitop", "FNaNbNiPkkZi") DEF_D_BUILTIN (BTR, NONE, "btr", "core.bitop", "FNaNbNiPkkZi") DEF_D_BUILTIN (BTS, NONE, "bts", "core.bitop", "FNaNbNiPkkZi") DEF_D_BUILTIN (BSF64, NONE, "bsf", "core.bitop", "FNaNbNiNfmZi") DEF_D_BUILTIN (BSR64, NONE, "bsr", "core.bitop", "FNaNbNiNfmZi") -DEF_D_BUILTIN (BT64, NONE, "bt", "core.bitop", "FNaNbNixPmmZi") +DEF_D_BUILTIN (BT64, NONE, "bt", "core.bitop", "FNaNbNiMxPmmZi") DEF_D_BUILTIN (BTC64, NONE, "btc", "core.bitop", "FNaNbNiPmmZi") DEF_D_BUILTIN (BTR64, NONE, "btr", "core.bitop", "FNaNbNiPmmZi") DEF_D_BUILTIN (BTS64, NONE, "bts", "core.bitop", "FNaNbNiPmmZi") +DEF_D_BUILTIN (BSWAP16, BSWAP16, "byteswap", "core.bitop", "FNaNbNiNftZt") DEF_D_BUILTIN (BSWAP32, BSWAP32, "bswap", "core.bitop", "FNaNbNiNfkZk") DEF_D_BUILTIN (BSWAP64, BSWAP64, "bswap", "core.bitop", "FNaNbNiNfmZm") @@ -64,32 +65,34 @@ DEF_D_BUILTIN (ROL_TIARG, NONE, "rol", "core.bitop", "FNaI1TZI1T") DEF_D_BUILTIN (ROR, NONE, "ror", "core.bitop", "FNaI1TkZI1T") DEF_D_BUILTIN (ROR_TIARG, NONE, "ror", "core.bitop", "FNaI1TZI1T") -DEF_D_BUILTIN (VLOAD8, NONE, "volatileLoad", "core.bitop", "FNbNiNfPhZh") -DEF_D_BUILTIN (VLOAD16, NONE, "volatileLoad", "core.bitop", "FNbNiNfPtZt") -DEF_D_BUILTIN (VLOAD32, NONE, "volatileLoad", "core.bitop", "FNbNiNfPkZk") -DEF_D_BUILTIN (VLOAD64, NONE, "volatileLoad", "core.bitop", "FNbNiNfPmZm") -DEF_D_BUILTIN (VSTORE8, NONE, "volatileStore", "core.bitop", "FNbNiNfPhhZv") -DEF_D_BUILTIN (VSTORE16, NONE, "volatileStore", "core.bitop", "FNbNiNfPttZv") -DEF_D_BUILTIN (VSTORE32, NONE, "volatileStore", "core.bitop", "FNbNiNfPkkZv") -DEF_D_BUILTIN (VSTORE64, NONE, "volatileStore", "core.bitop", "FNbNiNfPmmZv") +/* core.volatile intrinsics. */ + +DEF_D_BUILTIN (VLOAD8, NONE, "volatileLoad", "core.volatile", "FNbNiNfPhZh") +DEF_D_BUILTIN (VLOAD16, NONE, "volatileLoad", "core.volatile", "FNbNiNfPtZt") +DEF_D_BUILTIN (VLOAD32, NONE, "volatileLoad", "core.volatile", "FNbNiNfPkZk") +DEF_D_BUILTIN (VLOAD64, NONE, "volatileLoad", "core.volatile", "FNbNiNfPmZm") +DEF_D_BUILTIN (VSTORE8, NONE, "volatileStore", "core.volatile", "FNbNiNfPhhZv") +DEF_D_BUILTIN (VSTORE16, NONE, "volatileStore", "core.volatile", "FNbNiNfPttZv") +DEF_D_BUILTIN (VSTORE32, NONE, "volatileStore", "core.volatile", "FNbNiNfPkkZv") +DEF_D_BUILTIN (VSTORE64, NONE, "volatileStore", "core.volatile", "FNbNiNfPmmZv") /* core.checkedint intrinsics. */ -DEF_D_BUILTIN (ADDS, NONE, "adds", "core.checkedint", "FNaNbNiNfiiKbZi") -DEF_D_BUILTIN (ADDSL, NONE, "adds", "core.checkedint", "FNaNbNiNfllKbZl") -DEF_D_BUILTIN (ADDU, NONE, "addu", "core.checkedint", "FNaNbNiNfkkKbZk") -DEF_D_BUILTIN (ADDUL, NONE, "addu", "core.checkedint", "FNaNbNiNfmmKbZm") -DEF_D_BUILTIN (SUBS, NONE, "subs", "core.checkedint", "FNaNbNiNfiiKbZi") -DEF_D_BUILTIN (SUBSL, NONE, "subs", "core.checkedint", "FNaNbNiNfllKbZl") -DEF_D_BUILTIN (SUBU, NONE, "subu", "core.checkedint", "FNaNbNiNfkkKbZk") -DEF_D_BUILTIN (SUBUL, NONE, "subu", "core.checkedint", "FNaNbNiNfmmKbZm") -DEF_D_BUILTIN (MULS, NONE, "muls", "core.checkedint", "FNaNbNiNfiiKbZi") -DEF_D_BUILTIN (MULSL, NONE, "muls", "core.checkedint", "FNaNbNiNfllKbZl") -DEF_D_BUILTIN (MULU, NONE, "mulu", "core.checkedint", "FNaNbNiNfkkKbZk") -DEF_D_BUILTIN (MULUI, NONE, "mulu", "core.checkedint", "FNaNbNiNfmkKbZm") -DEF_D_BUILTIN (MULUL, NONE, "mulu", "core.checkedint", "FNaNbNiNfmmKbZm") -DEF_D_BUILTIN (NEGS, NONE, "negs", "core.checkedint", "FNaNbNiNfiKbZi") -DEF_D_BUILTIN (NEGSL, NONE, "negs", "core.checkedint", "FNaNbNiNflKbZl") +DEF_D_BUILTIN (ADDS, NONE, "adds", "core.checkedint", "FiiKbZi") +DEF_D_BUILTIN (ADDSL, NONE, "adds", "core.checkedint", "FllKbZl") +DEF_D_BUILTIN (ADDU, NONE, "addu", "core.checkedint", "FkkKbZk") +DEF_D_BUILTIN (ADDUL, NONE, "addu", "core.checkedint", "FmmKbZm") +DEF_D_BUILTIN (SUBS, NONE, "subs", "core.checkedint", "FiiKbZi") +DEF_D_BUILTIN (SUBSL, NONE, "subs", "core.checkedint", "FllKbZl") +DEF_D_BUILTIN (SUBU, NONE, "subu", "core.checkedint", "FkkKbZk") +DEF_D_BUILTIN (SUBUL, NONE, "subu", "core.checkedint", "FmmKbZm") +DEF_D_BUILTIN (MULS, NONE, "muls", "core.checkedint", "FiiKbZi") +DEF_D_BUILTIN (MULSL, NONE, "muls", "core.checkedint", "FllKbZl") +DEF_D_BUILTIN (MULU, NONE, "mulu", "core.checkedint", "FkkKbZk") +DEF_D_BUILTIN (MULUI, NONE, "mulu", "core.checkedint", "FmkKbZm") +DEF_D_BUILTIN (MULUL, NONE, "mulu", "core.checkedint", "FmmKbZm") +DEF_D_BUILTIN (NEGS, NONE, "negs", "core.checkedint", "FiKbZi") +DEF_D_BUILTIN (NEGSL, NONE, "negs", "core.checkedint", "FlKbZl") /* core.math intrinsics. */ diff --git a/gcc/testsuite/gdc.dg/intrinsics.d b/gcc/testsuite/gdc.dg/intrinsics.d index a775237..d9ccc0e 100644 --- a/gcc/testsuite/gdc.dg/intrinsics.d +++ b/gcc/testsuite/gdc.dg/intrinsics.d @@ -3,6 +3,7 @@ import core.bitop; import core.checkedint; import core.math; +import core.volatile; import core.stdc.stdarg; ////////////////////////////////////////////////////// @@ -24,6 +25,8 @@ int test_btc(size_t *a, size_t b) { return btc(a, b); } int test_btr(size_t *a, size_t b) { return btr(a, b); } // { dg-final { scan-tree-dump-not " = bts " "original" } } int test_bts(size_t *a, size_t b) { return bts(a, b); } +// { dg-final { scan-tree-dump " __builtin_bswap16 " "original" } } +ushort test_byteswap(ushort a) { return byteswap(a); } // { dg-final { scan-tree-dump " __builtin_bswap32 " "original" } } uint test_bswap(uint a) { return bswap(a); } // { dg-final { scan-tree-dump " __builtin_bswap64 " "original" } } -- cgit v1.1 From 0b34dbc0a24864b1674bff7a92fa3cf0f1cbcea1 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 4 Feb 2021 23:42:09 +0100 Subject: testsuite: Fix up pr25376.c on powerpc64-linux and array-quals-1.c on powerpc-linux [PR98325] The following patch fixes the pr25376.c testcase on powerpc64-linux and array-quals-1.c on powerpc-linux. Previously it failed like: FAIL: gcc.dg/array-quals-1.c scan-assembler-symbol-section symbol ^_?a1\$ (found a1) has section ^\\\\.(const|rodata|srodata)|\\\\[RO\\\\] (found .sdata) FAIL: gcc.dg/array-quals-1.c scan-assembler-symbol-section symbol ^_?b1\$ (found b1) has section ^\\\\.(const|rodata|srodata)|\\\\[RO\\\\] (found .sdata) FAIL: gcc.dg/array-quals-1.c scan-assembler-symbol-section symbol ^_?c1\$ (found c1) has section ^\\\\.(const|rodata|srodata)|\\\\[RO\\\\] (found .sdata) FAIL: gcc.dg/array-quals-1.c scan-assembler-symbol-section symbol ^_?d1\$ (found d1) has section ^\\\\.(const|rodata|srodata)|\\\\[RO\\\\] (found .sdata) FAIL: gcc.dg/array-quals-1.c scan-assembler-symbol-section symbol ^_?p\$ (found p) has section ^\\\\.(const|rodata|srodata)|\\\\[RW\\\\] (found .sdata) FAIL: gcc.dg/array-quals-1.c scan-assembler-symbol-section symbol ^_?p1\$ (found p1) has section ^\\\\.(const|rodata|srodata)|\\\\[RW\\\\] (found .sdata) FAIL: gcc.dg/array-quals-1.c scan-assembler-symbol-section symbol ^_?q\$ (found q) has section ^\\\\.(const|rodata|srodata)|\\\\[RW\\\\] (found .sdata) FAIL: gcc.dg/array-quals-1.c scan-assembler-symbol-section symbol ^_?q1\$ (found q1) has section ^\\\\.(const|rodata|srodata)|\\\\[RW\\\\] (found .sdata) FAIL: gcc.dg/array-quals-1.c scan-assembler-symbol-section symbol ^_?r\$ (found r) has section ^\\\\.(const|rodata|srodata)|\\\\[RW\\\\] (found .sdata) FAIL: gcc.dg/array-quals-1.c scan-assembler-symbol-section symbol ^_?r1\$ (found r1) has section ^\\\\.(const|rodata|srodata)|\\\\[RW\\\\] (found .sdata) FAIL: gcc.dg/array-quals-1.c scan-assembler-symbol-section symbol ^_?s\$ (found s) has section ^\\\\.(const|rodata|srodata)|\\\\[RW\\\\] (found .sdata) FAIL: gcc.dg/array-quals-1.c scan-assembler-symbol-section symbol ^_?s1\$ (found s1) has section ^\\\\.(const|rodata|srodata)|\\\\[RW\\\\] (found .sdata) FAIL: gcc.dg/array-quals-1.c scan-assembler-symbol-section symbol ^_?t\$ (found t) has section ^\\\\.(const|rodata|srodata)|\\\\[RW\\\\] (found .sdata) FAIL: gcc.dg/array-quals-1.c scan-assembler-symbol-section symbol ^_?t1\$ (found t1) has section ^\\\\.(const|rodata|srodata)|\\\\[RW\\\\] (found .sdata) FAIL: gcc.dg/pr25376.c scan-assembler-symbol-section symbol simple\$ (found .L.simple) has section ^\\\\.?my_named_section|simple\\\\[DS\\\\]|^\\\\"\\\\.opd\\\\" (found .opd) FAIL: gcc.dg/pr25376.c scan-assembler-symbol-section symbol simple\$ (found simple) has section ^\\\\.?my_named_section|simple\\\\[DS\\\\]|^\\\\"\\\\.opd\\\\" (found .opd) The problem with pr25376.c testcase are the ELFv1 function descriptors, .section my_named_section,"ax",@progbits .align 2 .globl simple .section ".opd","aw" .align 3 simple: .quad .L.simple,.TOC.@tocbase,0 .previous .type simple, @function .L.simple: so the simple symbol is found in the .opd section rather than in the my_named_section the test attempts to verify for that symbol. This patch deals it with two changes, the last two hunks in scanasm.exp teach it about the behavior of .previous directive and the first hunk for powerpc if symbol is in .opd section will try section in which the .L.symbol label is instead. The array-quals-1.c test fails because on powerpc-linux the symbols are emitted into .sdata section rather than one of the expected ones. 2021-02-04 Jakub Jelinek PR testsuite/98325 * lib/scanasm.exp (dg-scan-symbol-section): For powerpc*-*-* targets if $section is .opd, look at .L.$symbol_name's section. (parse_section_section_of_symbols): Handle .previous directive. * gcc.dg/array-quals-1.c: Allow .sdata section. --- gcc/testsuite/gcc.dg/array-quals-1.c | 30 +++++++++++++++--------------- gcc/testsuite/lib/scanasm.exp | 12 +++++++++++- 2 files changed, 26 insertions(+), 16 deletions(-) (limited to 'gcc') diff --git a/gcc/testsuite/gcc.dg/array-quals-1.c b/gcc/testsuite/gcc.dg/array-quals-1.c index c8d3629..5d9170e 100644 --- a/gcc/testsuite/gcc.dg/array-quals-1.c +++ b/gcc/testsuite/gcc.dg/array-quals-1.c @@ -8,44 +8,44 @@ /* { dg-final { scan-assembler-not "\\.data(?!\\.rel\\.ro)" { xfail powerpc*-*-aix* mmix-*-* x86_64-*-mingw* } } } */ /* { dg-final { scan-assembler-symbol-section {^_?a$} {^\.(const|rodata|srodata)|\[RO\]} } } */ static const int a[2] = { 1, 2 }; -/* { dg-final { scan-assembler-symbol-section {^_?a1$} {^\.(const|rodata|srodata)|\[RO\]} } } */ +/* { dg-final { scan-assembler-symbol-section {^_?a1$} {^\.(const|rodata|srodata|sdata)|\[RO\]} } } */ const int a1[2] = { 1, 2 }; typedef const int ci; /* { dg-final { scan-assembler-symbol-section {^_?b$} {^\.(const|rodata|srodata)|\[RO\]} } } */ static ci b[2] = { 3, 4 }; -/* { dg-final { scan-assembler-symbol-section {^_?b1$} {^\.(const|rodata|srodata)|\[RO\]} } } */ +/* { dg-final { scan-assembler-symbol-section {^_?b1$} {^\.(const|rodata|srodata|sdata)|\[RO\]} } } */ ci b1[2] = { 3, 4 }; typedef int ia[2]; /* { dg-final { scan-assembler-symbol-section {^_?c$} {^\.(const|rodata|srodata)|\[RO\]} } } */ static const ia c = { 5, 6 }; -/* { dg-final { scan-assembler-symbol-section {^_?c1$} {^\.(const|rodata|srodata)|\[RO\]} } } */ +/* { dg-final { scan-assembler-symbol-section {^_?c1$} {^\.(const|rodata|srodata|sdata)|\[RO\]} } } */ const ia c1 = { 5, 6 }; typedef const int cia[2]; /* { dg-final { scan-assembler-symbol-section {^_?d$} {^\.(const|rodata|srodata)|\[RO\]} } } */ static cia d = { 7, 8 }; -/* { dg-final { scan-assembler-symbol-section {^_?d1$} {^\.(const|rodata|srodata)|\[RO\]} } } */ +/* { dg-final { scan-assembler-symbol-section {^_?d1$} {^\.(const|rodata|srodata|sdata)|\[RO\]} } } */ cia d1 = { 7, 8 }; /* { dg-final { scan-assembler-symbol-section {^_?e$} {^\.(const|rodata|srodata)|\[RO\]} } } */ static cia e[2] = { { 1, 2 }, { 3, 4 } }; -/* { dg-final { scan-assembler-symbol-section {^_?e1$} {^\.(const|rodata|srodata)|\[RO\]} } } */ +/* { dg-final { scan-assembler-symbol-section {^_?e1$} {^\.(const|rodata|srodata|sdata)|\[RO\]} } } */ cia e1[2] = { { 1, 2 }, { 3, 4 } }; -/* { dg-final { scan-assembler-symbol-section {^_?p$} {^\.(const|rodata|srodata)|\[RW\]} } } */ +/* { dg-final { scan-assembler-symbol-section {^_?p$} {^\.(const|rodata|srodata|sdata)|\[RW\]} } } */ void *const p = &a; -/* { dg-final { scan-assembler-symbol-section {^_?q$} {^\.(const|rodata|srodata)|\[RW\]} } } */ +/* { dg-final { scan-assembler-symbol-section {^_?q$} {^\.(const|rodata|srodata|sdata)|\[RW\]} } } */ void *const q = &b; -/* { dg-final { scan-assembler-symbol-section {^_?r$} {^\.(const|rodata|srodata)|\[RW\]} } } */ +/* { dg-final { scan-assembler-symbol-section {^_?r$} {^\.(const|rodata|srodata|sdata)|\[RW\]} } } */ void *const r = &c; -/* { dg-final { scan-assembler-symbol-section {^_?s$} {^\.(const|rodata|srodata)|\[RW\]} } } */ +/* { dg-final { scan-assembler-symbol-section {^_?s$} {^\.(const|rodata|srodata|sdata)|\[RW\]} } } */ void *const s = &d; -/* { dg-final { scan-assembler-symbol-section {^_?t$} {^\.(const|rodata|srodata)|\[RW\]} } } */ +/* { dg-final { scan-assembler-symbol-section {^_?t$} {^\.(const|rodata|srodata|sdata)|\[RW\]} } } */ void *const t = &e; -/* { dg-final { scan-assembler-symbol-section {^_?p1$} {^\.(const|rodata|srodata)|\[RW\]} } } */ +/* { dg-final { scan-assembler-symbol-section {^_?p1$} {^\.(const|rodata|srodata|sdata)|\[RW\]} } } */ void *const p1 = &a1; -/* { dg-final { scan-assembler-symbol-section {^_?q1$} {^\.(const|rodata|srodata)|\[RW\]} } } */ +/* { dg-final { scan-assembler-symbol-section {^_?q1$} {^\.(const|rodata|srodata|sdata)|\[RW\]} } } */ void *const q1 = &b1; -/* { dg-final { scan-assembler-symbol-section {^_?r1$} {^\.(const|rodata|srodata)|\[RW\]} } } */ +/* { dg-final { scan-assembler-symbol-section {^_?r1$} {^\.(const|rodata|srodata|sdata)|\[RW\]} } } */ void *const r1 = &c1; -/* { dg-final { scan-assembler-symbol-section {^_?s1$} {^\.(const|rodata|srodata)|\[RW\]} } } */ +/* { dg-final { scan-assembler-symbol-section {^_?s1$} {^\.(const|rodata|srodata|sdata)|\[RW\]} } } */ void *const s1 = &d1; -/* { dg-final { scan-assembler-symbol-section {^_?t1$} {^\.(const|rodata|srodata)|\[RW\]} } } */ +/* { dg-final { scan-assembler-symbol-section {^_?t1$} {^\.(const|rodata|srodata|sdata)|\[RW\]} } } */ void *const t1 = &e1; diff --git a/gcc/testsuite/lib/scanasm.exp b/gcc/testsuite/lib/scanasm.exp index 65e3118..e723608 100644 --- a/gcc/testsuite/lib/scanasm.exp +++ b/gcc/testsuite/lib/scanasm.exp @@ -275,6 +275,9 @@ proc dg-scan-symbol-section { name testcase output_file orig_args } { foreach symbol_name [lsort [array names section_by_symbol]] { if { [regexp -- $symbol_pattern $symbol_name] } { set section $section_by_symbol($symbol_name) + if { [istarget powerpc*-*-*] && $section == ".opd" } { + set section $section_by_symbol(.L.$symbol_name) + } set description "$testcase $name symbol $printable_symbol_pattern (found $symbol_name) has section $printable_expected_section_pattern" if { $section == "" } { fail "$description (no section detected)" @@ -321,13 +324,16 @@ proc parse_section_of_symbols { filename result } { set section_pattern {^\s*(?:(?:\.section|\.csect)\s+(.*)|(\.const|\.data|\.text)\s*)$} set label_pattern {^(\S+):$} + set previous_pattern {^\s*\.previous\s*$} set fd [open $filename r] set current_section "" + set prev_section "" while { [gets $fd line] >= 0 } { if { [regexp -- $label_pattern $line dummy symbol_name] } { set up_result($symbol_name) $current_section } elseif { [regexp -- $section_pattern $line dummy section_directive_arguments full_section_directive] } { + set prev_section $current_section if { $full_section_directive eq "" } { # Example: .section .text,"ax",progbits # Example: .section ".text",#alloc,#execinstr,#progbits @@ -344,7 +350,11 @@ proc parse_section_of_symbols { filename result } { # Example: .text set current_section "$full_section_directive" } - } + } elseif { [regexp -- $previous_pattern $line dummy] } { + set sect $prev_section + set prev_section $current_section + set current_section $sect + } } close $fd } -- cgit v1.1 From cff6e8db880b6e262730b1ce9a9cb00c1f5571e2 Mon Sep 17 00:00:00 2001 From: Julian Brown Date: Fri, 29 Jan 2021 15:37:27 -0800 Subject: openacc: Dereference BT_CLASS data pointers but not BT_DERIVED pointers The stanza in gfc_trans_omp_clauses that handles derived type members that are themselves derived type pointers or class pointers now adds an explicit dereference only for the latter. The former is already dereferenced transparently in gfc_conv_component_ref. gcc/fortran/ * trans-openmp.c (gfc_trans_omp_clauses): Fix dereferencing for BT_DERIVED members. gcc/testsuite/ * gfortran.dg/goacc/derived-classtypes-1.f95: New test. --- gcc/fortran/trans-openmp.c | 7 +- .../gfortran.dg/goacc/derived-classtypes-1.f95 | 129 +++++++++++++++++++++ 2 files changed, 133 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/goacc/derived-classtypes-1.f95 (limited to 'gcc') diff --git a/gcc/fortran/trans-openmp.c b/gcc/fortran/trans-openmp.c index 00358ca..a5fe0e7 100644 --- a/gcc/fortran/trans-openmp.c +++ b/gcc/fortran/trans-openmp.c @@ -3004,6 +3004,8 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses, if (lastcomp->u.c.component->ts.type == BT_CLASS) { data = gfc_class_data_get (inner); + gcc_assert (POINTER_TYPE_P (TREE_TYPE (data))); + data = build_fold_indirect_ref (data); size = gfc_class_vtab_size_get (inner); } else /* BT_DERIVED. */ @@ -3012,8 +3014,7 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses, size = TYPE_SIZE_UNIT (TREE_TYPE (inner)); } - OMP_CLAUSE_DECL (node) - = build_fold_indirect_ref (data); + OMP_CLAUSE_DECL (node) = data; OMP_CLAUSE_SIZE (node) = size; node2 = build_omp_clause (input_location, OMP_CLAUSE_MAP); @@ -3021,7 +3022,7 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses, openacc ? GOMP_MAP_ATTACH_DETACH : GOMP_MAP_ALWAYS_POINTER); - OMP_CLAUSE_DECL (node2) = data; + OMP_CLAUSE_DECL (node2) = build_fold_addr_expr (data); OMP_CLAUSE_SIZE (node2) = size_int (0); } else diff --git a/gcc/testsuite/gfortran.dg/goacc/derived-classtypes-1.f95 b/gcc/testsuite/gfortran.dg/goacc/derived-classtypes-1.f95 new file mode 100644 index 0000000..e6cf09c --- /dev/null +++ b/gcc/testsuite/gfortran.dg/goacc/derived-classtypes-1.f95 @@ -0,0 +1,129 @@ +type :: type1 + integer :: a +end type type1 + +type :: type2 + integer, pointer :: b +end type type2 + +type :: aux1 + integer :: y +end type aux1 + +type, extends(aux1) :: aux + integer :: x +end type aux + +type :: type3 + class(aux), pointer :: c(:) +end type type3 + +type :: type4 + integer, pointer :: d(:) +end type type4 + +type :: type5 + type(aux) :: e +end type type5 + +type :: type6 + type(aux), pointer :: f +end type type6 + +type :: type7 + class(aux), pointer :: g +end type type7 + +type(type1) :: foo +type(type2) :: bar +type(type3) :: qux +type(type4) :: quux +type(type5) :: fred +type(type6) :: jim +type(type7) :: shiela + +type(type1), pointer :: pfoo +type(type2), pointer :: pbar +type(type3), pointer :: pqux +type(type4), pointer :: pquux +type(type5), pointer :: pfred +type(type6), pointer :: pjim +type(type7), pointer :: pshiela + +class(type1), pointer :: cfoo +class(type2), pointer :: cbar +class(type3), pointer :: cqux +class(type4), pointer :: cquux +class(type5), pointer :: cfred +class(type6), pointer :: cjim +class(type7), pointer :: cshiela + +class(type1), allocatable :: acfoo +class(type2), allocatable :: acbar +class(type3), allocatable :: acqux +class(type4), allocatable :: acquux +class(type5), allocatable :: acfred +class(type6), allocatable :: acjim +class(type7), allocatable :: acshiela + +!$acc enter data copyin(foo) +!$acc enter data copyin(foo%a) +!$acc enter data copyin(bar) +!$acc enter data copyin(bar%b) +!$acc enter data copyin(qux) +!!$acc enter data copyin(qux%c) +!$acc enter data copyin(quux) +!$acc enter data copyin(quux%d) +!$acc enter data copyin(fred) +!$acc enter data copyin(fred%e) +!$acc enter data copyin(jim) +!$acc enter data copyin(jim%f) +!$acc enter data copyin(shiela) +!$acc enter data copyin(shiela%g) + +!$acc enter data copyin(pfoo) +!$acc enter data copyin(pfoo%a) +!$acc enter data copyin(pbar) +!$acc enter data copyin(pbar%b) +!$acc enter data copyin(pqux) +!!$acc enter data copyin(pqux%c) +!$acc enter data copyin(pquux) +!$acc enter data copyin(pquux%d) +!$acc enter data copyin(pfred) +!$acc enter data copyin(pfred%e) +!$acc enter data copyin(pjim) +!$acc enter data copyin(pjim%f) +!$acc enter data copyin(pshiela) +!$acc enter data copyin(pshiela%g) + +!$acc enter data copyin(cfoo) +!$acc enter data copyin(cfoo%a) +!$acc enter data copyin(cbar) +!$acc enter data copyin(cbar%b) +!$acc enter data copyin(cqux) +!!$acc enter data copyin(cqux%c) +!$acc enter data copyin(cquux) +!$acc enter data copyin(cquux%d) +!$acc enter data copyin(cfred) +!$acc enter data copyin(cfred%e) +!$acc enter data copyin(cjim) +!$acc enter data copyin(cjim%f) +!$acc enter data copyin(cshiela) +!$acc enter data copyin(cshiela%g) + +!$acc enter data copyin(acfoo) +!$acc enter data copyin(acfoo%a) +!$acc enter data copyin(acbar) +!$acc enter data copyin(acbar%b) +!$acc enter data copyin(acqux) +!!$acc enter data copyin(acqux%c) +!$acc enter data copyin(acquux) +!$acc enter data copyin(acquux%d) +!$acc enter data copyin(acfred) +!$acc enter data copyin(acfred%e) +!$acc enter data copyin(acjim) +!$acc enter data copyin(acjim%f) +!$acc enter data copyin(acshiela) +!$acc enter data copyin(acshiela%g) + +end -- cgit v1.1 From f743fe231663e32d52db987650d0ec3381a777af Mon Sep 17 00:00:00 2001 From: Julian Brown Date: Fri, 29 Jan 2021 17:18:07 -0800 Subject: openacc: Use class_pointer instead of pointer attribute for class types Elsewhere in the Fortran front-end, the class_pointer attribute is used for BT_CLASS entities instead of the pointer attribute. This patch follows suit for OpenACC. I couldn't actually come up with a test case where this makes a difference (i.e., where "class_pointer" and "pointer" have different values at this point in the code), but this may nonetheless fix a latent bug. gcc/fortran/ * trans-openmp.c (gfc_trans_omp_clauses): Use class_pointer attribute for BT_CLASS. --- gcc/fortran/trans-openmp.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'gcc') diff --git a/gcc/fortran/trans-openmp.c b/gcc/fortran/trans-openmp.c index a5fe0e7..249b3de 100644 --- a/gcc/fortran/trans-openmp.c +++ b/gcc/fortran/trans-openmp.c @@ -2997,7 +2997,10 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses, if (lastcomp->u.c.component->ts.type == BT_DERIVED || lastcomp->u.c.component->ts.type == BT_CLASS) { - if (sym_attr.pointer || (openacc && sym_attr.allocatable)) + bool pointer + = (lastcomp->u.c.component->ts.type == BT_CLASS + ? sym_attr.class_pointer : sym_attr.pointer); + if (pointer || (openacc && sym_attr.allocatable)) { tree data, size; -- cgit v1.1 From 9a4d32f85ccebc0ee4b24e6d9d7a4f11c04d7146 Mon Sep 17 00:00:00 2001 From: Julian Brown Date: Tue, 2 Feb 2021 03:44:34 -0800 Subject: openacc: Allow strided arrays in update directives OpenACC 3.0 ("2.14.4. Update Directive") states: Noncontiguous subarrays may appear. It is implementation-specific whether noncontiguous regions are updated by using one transfer for each contiguous subregion, or whether the non-contiguous data is packed, transferred once, and unpacked, or whether one or more larger subarrays (no larger than the smallest contiguous region that contains the specified subarray) are updated. This patch relaxes some conditions in the Fortran front-end so that strided accesses are permitted for update directives. gcc/fortran/ * openmp.c (resolve_omp_clauses): Omit OpenACC update in contiguity check and stride-specified error. gcc/testsuite/ * gfortran.dg/goacc/array-with-dt-2.f90: New test. libgomp/ * testsuite/libgomp.oacc-fortran/array-stride-dt-1.f90: New test. --- gcc/fortran/openmp.c | 5 +++-- gcc/testsuite/gfortran.dg/goacc/array-with-dt-2.f90 | 10 ++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/goacc/array-with-dt-2.f90 (limited to 'gcc') diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c index aab17f0..797f6c8 100644 --- a/gcc/fortran/openmp.c +++ b/gcc/fortran/openmp.c @@ -5192,7 +5192,8 @@ resolve_omp_clauses (gfc_code *code, gfc_omp_clauses *omp_clauses, array isn't contiguous. An expression such as arr(-n:n,-n:n) could be contiguous even if it looks like it may not be. */ - if (list != OMP_LIST_CACHE + if (code->op != EXEC_OACC_UPDATE + && list != OMP_LIST_CACHE && list != OMP_LIST_DEPEND && !gfc_is_simply_contiguous (n->expr, false, true) && gfc_is_not_contiguous (n->expr)) @@ -5230,7 +5231,7 @@ resolve_omp_clauses (gfc_code *code, gfc_omp_clauses *omp_clauses, int i; gfc_array_ref *ar = &array_ref->u.ar; for (i = 0; i < ar->dimen; i++) - if (ar->stride[i]) + if (ar->stride[i] && code->op != EXEC_OACC_UPDATE) { gfc_error ("Stride should not be specified for " "array section in %s clause at %L", diff --git a/gcc/testsuite/gfortran.dg/goacc/array-with-dt-2.f90 b/gcc/testsuite/gfortran.dg/goacc/array-with-dt-2.f90 new file mode 100644 index 0000000..807580d --- /dev/null +++ b/gcc/testsuite/gfortran.dg/goacc/array-with-dt-2.f90 @@ -0,0 +1,10 @@ +type t + integer, allocatable :: A(:,:) +end type t + +type(t), allocatable :: b(:) + +!$acc update host(b(::2)) +!$acc update host(b(1)%A(::3,::4)) +end + -- cgit v1.1 From b2d84e9f9cccbe4ee662f7002b83105629d09939 Mon Sep 17 00:00:00 2001 From: Julian Brown Date: Thu, 4 Feb 2021 10:13:22 -0800 Subject: openacc: Tests for character types in derived-type mappings This patch adds some tests for character types that are components of derived types used in OpenACC data-movement clauses. gcc/testsuite/ * gfortran.dg/goacc/derived-chartypes-1.f90: New test. * gfortran.dg/goacc/derived-chartypes-2.f90: Likewise. * gfortran.dg/goacc/derived-chartypes-3.f90: Likewise. * gfortran.dg/goacc/derived-chartypes-4.f90: Likewise. --- .../gfortran.dg/goacc/derived-chartypes-1.f90 | 129 +++++++++++++++++++++ .../gfortran.dg/goacc/derived-chartypes-2.f90 | 129 +++++++++++++++++++++ .../gfortran.dg/goacc/derived-chartypes-3.f90 | 38 ++++++ .../gfortran.dg/goacc/derived-chartypes-4.f90 | 38 ++++++ 4 files changed, 334 insertions(+) create mode 100644 gcc/testsuite/gfortran.dg/goacc/derived-chartypes-1.f90 create mode 100644 gcc/testsuite/gfortran.dg/goacc/derived-chartypes-2.f90 create mode 100644 gcc/testsuite/gfortran.dg/goacc/derived-chartypes-3.f90 create mode 100644 gcc/testsuite/gfortran.dg/goacc/derived-chartypes-4.f90 (limited to 'gcc') diff --git a/gcc/testsuite/gfortran.dg/goacc/derived-chartypes-1.f90 b/gcc/testsuite/gfortran.dg/goacc/derived-chartypes-1.f90 new file mode 100644 index 0000000..e4d360e --- /dev/null +++ b/gcc/testsuite/gfortran.dg/goacc/derived-chartypes-1.f90 @@ -0,0 +1,129 @@ +type :: type1 + character(len=35) :: a +end type type1 + +type :: type2 + character(len=35), pointer :: b +end type type2 + +type :: aux1 + character(len=22) :: y +end type aux1 + +type, extends(aux1) :: aux + character(len=33) :: x +end type aux + +type :: type3 + class(aux), pointer :: c(:) +end type type3 + +type :: type4 + integer, pointer :: d(:) +end type type4 + +type :: type5 + type(aux1) :: e +end type type5 + +type :: type6 + type(aux1), pointer :: f +end type type6 + +type :: type7 + class(aux), pointer :: g +end type type7 + +type(type1) :: foo +type(type2) :: bar +type(type3) :: qux +type(type4) :: quux +type(type5) :: fred +type(type6) :: jim +type(type7) :: shiela + +type(type1), pointer :: pfoo +type(type2), pointer :: pbar +type(type3), pointer :: pqux +type(type4), pointer :: pquux +type(type5), pointer :: pfred +type(type6), pointer :: pjim +type(type7), pointer :: pshiela + +class(type1), pointer :: cfoo +class(type2), pointer :: cbar +class(type3), pointer :: cqux +class(type4), pointer :: cquux +class(type5), pointer :: cfred +class(type6), pointer :: cjim +class(type7), pointer :: cshiela + +class(type1), allocatable :: acfoo +class(type2), allocatable :: acbar +class(type3), allocatable :: acqux +class(type4), allocatable :: acquux +class(type5), allocatable :: acfred +class(type6), allocatable :: acjim +class(type7), allocatable :: acshiela + +!$acc enter data copyin(foo) +!$acc enter data copyin(foo%a) +!$acc enter data copyin(bar) +!$acc enter data copyin(bar%b) +!$acc enter data copyin(qux) +!$acc enter data copyin(qux%c) +!$acc enter data copyin(quux) +!$acc enter data copyin(quux%d) +!$acc enter data copyin(fred) +!$acc enter data copyin(fred%e) +!$acc enter data copyin(jim) +!$acc enter data copyin(jim%f) +!$acc enter data copyin(shiela) +!$acc enter data copyin(shiela%g) + +!$acc enter data copyin(pfoo) +!$acc enter data copyin(pfoo%a) +!$acc enter data copyin(pbar) +!$acc enter data copyin(pbar%b) +!$acc enter data copyin(pqux) +!$acc enter data copyin(pqux%c) +!$acc enter data copyin(pquux) +!$acc enter data copyin(pquux%d) +!$acc enter data copyin(pfred) +!$acc enter data copyin(pfred%e) +!$acc enter data copyin(pjim) +!$acc enter data copyin(pjim%f) +!$acc enter data copyin(pshiela) +!$acc enter data copyin(pshiela%g) + +!$acc enter data copyin(cfoo) +!$acc enter data copyin(cfoo%a) +!$acc enter data copyin(cbar) +!$acc enter data copyin(cbar%b) +!$acc enter data copyin(cqux) +!$acc enter data copyin(cqux%c) +!$acc enter data copyin(cquux) +!$acc enter data copyin(cquux%d) +!$acc enter data copyin(cfred) +!$acc enter data copyin(cfred%e) +!$acc enter data copyin(cjim) +!$acc enter data copyin(cjim%f) +!$acc enter data copyin(cshiela) +!$acc enter data copyin(cshiela%g) + +!$acc enter data copyin(acfoo) +!$acc enter data copyin(acfoo%a) +!$acc enter data copyin(acbar) +!$acc enter data copyin(acbar%b) +!$acc enter data copyin(acqux) +!$acc enter data copyin(acqux%c) +!$acc enter data copyin(acquux) +!$acc enter data copyin(acquux%d) +!$acc enter data copyin(acfred) +!$acc enter data copyin(acfred%e) +!$acc enter data copyin(acjim) +!$acc enter data copyin(acjim%f) +!$acc enter data copyin(acshiela) +!$acc enter data copyin(acshiela%g) + +end diff --git a/gcc/testsuite/gfortran.dg/goacc/derived-chartypes-2.f90 b/gcc/testsuite/gfortran.dg/goacc/derived-chartypes-2.f90 new file mode 100644 index 0000000..cca6443 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/goacc/derived-chartypes-2.f90 @@ -0,0 +1,129 @@ +type :: type1 + character(len=35,kind=4) :: a +end type type1 + +type :: type2 + character(len=35,kind=4), pointer :: b +end type type2 + +type :: aux1 + character(len=22,kind=4) :: y +end type aux1 + +type, extends(aux1) :: aux + character(len=33,kind=4) :: x +end type aux + +type :: type3 + class(aux), pointer :: c(:) +end type type3 + +type :: type4 + integer, pointer :: d(:) +end type type4 + +type :: type5 + type(aux1) :: e +end type type5 + +type :: type6 + type(aux1), pointer :: f +end type type6 + +type :: type7 + class(aux), pointer :: g +end type type7 + +type(type1) :: foo +type(type2) :: bar +type(type3) :: qux +type(type4) :: quux +type(type5) :: fred +type(type6) :: jim +type(type7) :: shiela + +type(type1), pointer :: pfoo +type(type2), pointer :: pbar +type(type3), pointer :: pqux +type(type4), pointer :: pquux +type(type5), pointer :: pfred +type(type6), pointer :: pjim +type(type7), pointer :: pshiela + +class(type1), pointer :: cfoo +class(type2), pointer :: cbar +class(type3), pointer :: cqux +class(type4), pointer :: cquux +class(type5), pointer :: cfred +class(type6), pointer :: cjim +class(type7), pointer :: cshiela + +class(type1), allocatable :: acfoo +class(type2), allocatable :: acbar +class(type3), allocatable :: acqux +class(type4), allocatable :: acquux +class(type5), allocatable :: acfred +class(type6), allocatable :: acjim +class(type7), allocatable :: acshiela + +!$acc enter data copyin(foo) +!$acc enter data copyin(foo%a) +!$acc enter data copyin(bar) +!$acc enter data copyin(bar%b) +!$acc enter data copyin(qux) +!$acc enter data copyin(qux%c) +!$acc enter data copyin(quux) +!$acc enter data copyin(quux%d) +!$acc enter data copyin(fred) +!$acc enter data copyin(fred%e) +!$acc enter data copyin(jim) +!$acc enter data copyin(jim%f) +!$acc enter data copyin(shiela) +!$acc enter data copyin(shiela%g) + +!$acc enter data copyin(pfoo) +!$acc enter data copyin(pfoo%a) +!$acc enter data copyin(pbar) +!$acc enter data copyin(pbar%b) +!$acc enter data copyin(pqux) +!$acc enter data copyin(pqux%c) +!$acc enter data copyin(pquux) +!$acc enter data copyin(pquux%d) +!$acc enter data copyin(pfred) +!$acc enter data copyin(pfred%e) +!$acc enter data copyin(pjim) +!$acc enter data copyin(pjim%f) +!$acc enter data copyin(pshiela) +!$acc enter data copyin(pshiela%g) + +!$acc enter data copyin(cfoo) +!$acc enter data copyin(cfoo%a) +!$acc enter data copyin(cbar) +!$acc enter data copyin(cbar%b) +!$acc enter data copyin(cqux) +!$acc enter data copyin(cqux%c) +!$acc enter data copyin(cquux) +!$acc enter data copyin(cquux%d) +!$acc enter data copyin(cfred) +!$acc enter data copyin(cfred%e) +!$acc enter data copyin(cjim) +!$acc enter data copyin(cjim%f) +!$acc enter data copyin(cshiela) +!$acc enter data copyin(cshiela%g) + +!$acc enter data copyin(acfoo) +!$acc enter data copyin(acfoo%a) +!$acc enter data copyin(acbar) +!$acc enter data copyin(acbar%b) +!$acc enter data copyin(acqux) +!$acc enter data copyin(acqux%c) +!$acc enter data copyin(acquux) +!$acc enter data copyin(acquux%d) +!$acc enter data copyin(acfred) +!$acc enter data copyin(acfred%e) +!$acc enter data copyin(acjim) +!$acc enter data copyin(acjim%f) +!$acc enter data copyin(acshiela) +!$acc enter data copyin(acshiela%g) + +end diff --git a/gcc/testsuite/gfortran.dg/goacc/derived-chartypes-3.f90 b/gcc/testsuite/gfortran.dg/goacc/derived-chartypes-3.f90 new file mode 100644 index 0000000..2bab497 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/goacc/derived-chartypes-3.f90 @@ -0,0 +1,38 @@ +! { dg-additional-options "-fdump-tree-gimple" } + +type :: type1 + character(len=35) :: a +end type type1 + +type :: type2 + character(len=46), pointer :: b +end type type2 + +type(type1) :: foo +type(type2) :: bar + +type(type1), pointer :: pfoo +type(type2), pointer :: pbar + +class(type1), pointer :: cfoo +class(type2), pointer :: cbar + +class(type1), allocatable :: acfoo +class(type2), allocatable :: acbar + +!$acc enter data copyin(foo%a) +!$acc enter data copyin(bar%b) + +!$acc enter data copyin(pfoo%a) +!$acc enter data copyin(pbar%b) + +!$acc enter data copyin(cfoo%a) +!$acc enter data copyin(cbar%b) + +!$acc enter data copyin(acfoo%a) +!$acc enter data copyin(acbar%b) + +! { dg-final { scan-tree-dump-times "to:\[^\\\[\]*\\\[len: 35\\\]" 4 "gimple" } } +! { dg-final { scan-tree-dump-times "to:\[^\\\[\]*\\\[len: 46\\\]" 4 "gimple" } } + +end diff --git a/gcc/testsuite/gfortran.dg/goacc/derived-chartypes-4.f90 b/gcc/testsuite/gfortran.dg/goacc/derived-chartypes-4.f90 new file mode 100644 index 0000000..cfe4006 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/goacc/derived-chartypes-4.f90 @@ -0,0 +1,38 @@ +! { dg-additional-options "-fdump-tree-gimple" } + +type :: type1 + character(len=35,kind=4) :: a +end type type1 + +type :: type2 + character(len=46,kind=4), pointer :: b +end type type2 + +type(type1) :: foo +type(type2) :: bar + +type(type1), pointer :: pfoo +type(type2), pointer :: pbar + +class(type1), pointer :: cfoo +class(type2), pointer :: cbar + +class(type1), allocatable :: acfoo +class(type2), allocatable :: acbar + +!$acc enter data copyin(foo%a) +!$acc enter data copyin(bar%b) + +!$acc enter data copyin(pfoo%a) +!$acc enter data copyin(pbar%b) + +!$acc enter data copyin(cfoo%a) +!$acc enter data copyin(cbar%b) + +!$acc enter data copyin(acfoo%a) +!$acc enter data copyin(acbar%b) + +! { dg-final { scan-tree-dump-times "to:\[^\\\[\]*\\\[len: 140\\\]" 4 "gimple" } } +! { dg-final { scan-tree-dump-times "to:\[^\\\[\]*\\\[len: 184\\\]" 4 "gimple" } } + +end -- cgit v1.1 From a19dd5e644ae8725f17bf52c54354b61f771d2c4 Mon Sep 17 00:00:00 2001 From: GCC Administrator Date: Fri, 5 Feb 2021 00:16:23 +0000 Subject: Daily bump. --- gcc/ChangeLog | 53 ++++++++++++++++++++++++++++ gcc/DATESTAMP | 2 +- gcc/c-family/ChangeLog | 4 +++ gcc/c/ChangeLog | 9 +++++ gcc/cp/ChangeLog | 33 ++++++++++++++++++ gcc/d/ChangeLog | 35 +++++++++++++++++++ gcc/fortran/ChangeLog | 20 +++++++++++ gcc/testsuite/ChangeLog | 92 +++++++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 247 insertions(+), 1 deletion(-) (limited to 'gcc') diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 388681f..861beeb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,56 @@ +2021-02-04 David Malcolm + + PR c/97932 + * diagnostic-show-locus.c (compatible_locations_p): Require + locations in the same macro map to be either both from the + macro definition, or both from the macro arguments. + +2021-02-04 Jonathan Wright + + * config/aarch64/aarch64-simd-builtins.def: Add + [su]mull_hi_lane[q] builtin generator macros. + * config/aarch64/aarch64-simd.md + (aarch64_mull_hi_lane_insn): Define. + (aarch64_mull_hi_lane): Define. + (aarch64_mull_hi_laneq_insn): Define. + (aarch64_mull_hi_laneq): Define. + * config/aarch64/arm_neon.h (vmull_high_lane_s16): Use RTL + builtin instead of inline asm. + (vmull_high_lane_s32): Likewise. + (vmull_high_lane_u16): Likewise. + (vmull_high_lane_u32): Likewise. + (vmull_high_laneq_s16): Likewise. + (vmull_high_laneq_s32): Likewise. + (vmull_high_laneq_u16): Likewise. + (vmull_high_laneq_u32): Liekwise. + +2021-02-04 Jonathan Wright + + * config/aarch64/aarch64-simd-builtins.def: Add [su]mull_hi_n + builtin generator macros. + * config/aarch64/aarch64-simd.md + (aarch64_mull_hi_n_insn): Define. + (aarch64_mull_hi_n): Define. + * config/aarch64/arm_neon.h (vmull_high_n_s16): Use RTL builtin + instead of inline asm. + (vmull_high_n_s32): Likewise. + (vmull_high_n_u16): Likewise. + (vmull_high_n_u32): Likewise. + +2021-02-04 Richard Biener + + PR tree-optimization/98855 + * tree-vect-loop.c (vectorizable_phi): Do not cost + single-argument PHIs. + * tree-vect-slp.c (vect_bb_slp_scalar_cost): Likewise. + * tree-vect-stmts.c (vectorizable_bswap): Also perform + costing for SLP operation. + +2021-02-04 Martin Liska + + * doc/extend.texi: Mention -mprefer-vector-width in target + attributes. + 2021-02-03 Martin Sebor PR tree-optimization/98937 diff --git a/gcc/DATESTAMP b/gcc/DATESTAMP index 8aed06e..b5d696c 100644 --- a/gcc/DATESTAMP +++ b/gcc/DATESTAMP @@ -1 +1 @@ -20210204 +20210205 diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 0369b70..86005a3 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,7 @@ +2021-02-04 emsr <3dw4rd@verizon.net> + + * c-cppbuiltin.c (c_cpp_builtins): __cpp_size_t_suffix=202011L. + 2021-02-03 Ed Smith-Rowland <3dw4rd@verizon.net> * c-cppbuiltin.c (c_cpp_builtins): Define __cpp_size_t_suffix. diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 9afa103..b306491 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,12 @@ +2021-02-04 Martin Sebor + + PR c/97882 + * c-decl.c (locate_old_decl): Add type to diagnostic output. + (diagnose_mismatched_decls): Same. + (start_function): Introduce temporaries for better readability. + * c-typeck.c (comptypes_internal): Only consider complete enum + types in comparisons with integers. + 2021-02-01 Martin Sebor PR middle-end/97172 diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2804cd1..1a1ffeb 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,36 @@ +2021-02-04 Jason Merrill + + PR c++/98717 + * constraint.cc (build_concept_check_arguments): Remove assert. + (build_concept_check): Allow empty args. + +2021-02-04 Tom Greenslade (thomgree) + + PR c++/90926 + * call.c (can_convert_array): Extend to handle all valid aggregate + initializers of an array; including by string literals, not just by + brace-init-list. + (build_aggr_conv): Call can_convert_array more often, not just in + brace-init-list case. + * typeck2.c (array_string_literal_compatible_p): New function. + (digest_init_r): call array_string_literal_compatible_p + * cp-tree.h: (array_string_literal_compatible_p): Declare. + +2021-02-04 Jason Merrill + + PR c++/98802 + * pt.c (do_class_deduction): No aggregate guide if any_dguides_p. + +2021-02-04 Jason Merrill + + PR c++/95192 + * pt.c (tsubst_attribute): Handle error. + (apply_late_template_attributes): Return false on error. + (tsubst_function_decl): Check its return value. + (tsubst_decl): Likewise. + (push_template_decl): Assert current_template_parms. + (tsubst_template_decl): Set current_template_parms. + 2021-02-03 Marek Polacek PR c++/98951 diff --git a/gcc/d/ChangeLog b/gcc/d/ChangeLog index 354f65f..a51ecdb 100644 --- a/gcc/d/ChangeLog +++ b/gcc/d/ChangeLog @@ -1,3 +1,38 @@ +2021-02-04 Iain Buclaw + + * dmd/MERGE: Merge upstream dmd 46133f761. + * d-builtins.cc (d_build_builtins_module): Set builtins as BUILTINgcc. + (maybe_set_builtin_1): Likewise. + * d-frontend.cc (eval_builtin): Adjust condition for early return. + * intrinsics.cc (maybe_set_intrinsic): Set intrinsics as BUILTINgcc. + (maybe_expand_intrinsic): Add case for INTRINSIC_BSWAP16. + * intrinsics.def (INTRINSIC_BT): Update signature. + (INTRINSIC_BT64): Likewise. + (INTRINSIC_BSWAP16): New intrinsic. + (INTRINSIC_VLOAD8): Update module. + (INTRINSIC_VLOAD16): Likewise. + (INTRINSIC_VLOAD32): Likewise. + (INTRINSIC_VLOAD64): Likewise. + (INTRINSIC_VSTORE8): Likewise. + (INTRINSIC_VSTORE16): Likewise. + (INTRINSIC_VSTORE32): Likewise. + (INTRINSIC_VSTORE64): Likewise. + (INTRINSIC_ADDS): Update signature. + (INTRINSIC_ADDSL): Likewise. + (INTRINSIC_ADDU): Likewise. + (INTRINSIC_ADDUL): Likewise. + (INTRINSIC_SUBS): Likewise. + (INTRINSIC_SUBSL): Likewise. + (INTRINSIC_SUBU): Likewise. + (INTRINSIC_SUBUL): Likewise. + (INTRINSIC_MULS): Likewise. + (INTRINSIC_MULSL): Likewise. + (INTRINSIC_MULU): Likewise. + (INTRINSIC_MULUI): Likewise. + (INTRINSIC_MULUL): Likewise. + (INTRINSIC_NEGS): Likewise. + (INTRINSIC_NEGSL): Likewise. + 2021-02-02 Iain Buclaw PR d/98921 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 9f75bb7..4d433a1 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,23 @@ +2021-02-04 Julian Brown + + * openmp.c (resolve_omp_clauses): Omit OpenACC update in + contiguity check and stride-specified error. + +2021-02-04 Julian Brown + + * trans-openmp.c (gfc_trans_omp_clauses): Use class_pointer attribute + for BT_CLASS. + +2021-02-04 Julian Brown + + * trans-openmp.c (gfc_trans_omp_clauses): Fix dereferencing for + BT_DERIVED members. + +2021-02-04 Tobias Burnus + + * openmp.c (resolve_omp_clauses): Explicitly diagnose + substrings as not permitted. + 2021-02-03 Jeff Law * intrinsic.texi (ANINT): Fix typo. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4163d76..e2931e3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,95 @@ +2021-02-04 Julian Brown + + * gfortran.dg/goacc/derived-chartypes-1.f90: New test. + * gfortran.dg/goacc/derived-chartypes-2.f90: Likewise. + * gfortran.dg/goacc/derived-chartypes-3.f90: Likewise. + * gfortran.dg/goacc/derived-chartypes-4.f90: Likewise. + +2021-02-04 Julian Brown + + * gfortran.dg/goacc/array-with-dt-2.f90: New test. + +2021-02-04 Julian Brown + + * gfortran.dg/goacc/derived-classtypes-1.f95: New test. + +2021-02-04 Jakub Jelinek + + PR testsuite/98325 + * lib/scanasm.exp (dg-scan-symbol-section): For powerpc*-*-* targets if + $section is .opd, look at .L.$symbol_name's section. + (parse_section_section_of_symbols): Handle .previous directive. + * gcc.dg/array-quals-1.c: Allow .sdata section. + +2021-02-04 Iain Buclaw + + * gdc.dg/intrinsics.d: Update test. + +2021-02-04 Martin Sebor + + PR c/97882 + * gcc.dg/decl-8.c: Adjust text of expected diagnostic. + * gcc.dg/label-decl-4.c: Same. + * gcc.dg/mismatch-decl-1.c: Same. + * gcc.dg/old-style-then-proto-1.c: Same. + * gcc.dg/parm-mismatch-1.c: Same. + * gcc.dg/pr35445.c: Same. + * gcc.dg/redecl-11.c: Same. + * gcc.dg/redecl-12.c: Same. + * gcc.dg/redecl-13.c: Same. + * gcc.dg/redecl-15.c: Same. + * gcc.dg/tls/thr-init-1.c: Same. + * objc.dg/id-1.m: Same. + * objc.dg/tls/diag-3.m: Same. + * gcc.dg/pr97882.c: New test. + * gcc.dg/qual-return-7.c: New test. + * gcc.dg/qual-return-8.c: New test. + +2021-02-04 Jason Merrill + + PR c++/98717 + * g++.dg/cpp2a/concepts-variadic3.C: New test. + +2021-02-04 David Malcolm + + PR c/97932 + * gcc.dg/pr97932.c: New test. + +2021-02-04 emsr <3dw4rd@verizon.net> + + * g++.dg/cpp23/feat-cxx2b.C: __cpp_size_t_suffix == 202011. + +2021-02-04 Jakub Jelinek + + * g++.dg/warn/Wsize_t-literals.C: Expect make_signed_t instead + of make_signed::type in the diagnostics. + +2021-02-04 Tom Greenslade (thomgree) + + PR c++/90926 + * g++.dg/cpp1y/nsdmi-aggr12.C: New test. + +2021-02-04 Tobias Burnus + + * gfortran.dg/goacc/substring.f90: New test. + * gfortran.dg/gomp/substring.f90: New test. + +2021-02-04 Martin Liska + + * gcc.target/i386/prefer-vector-width-attr.c: New test. + +2021-02-04 Jason Merrill + + PR c++/98802 + * g++.dg/cpp1z/class-deduction78.C: New test. + +2021-02-04 Jason Merrill + + PR c++/95192 + * g++.dg/cpp0x/pr84630.C: Call b(). + * g++.dg/cpp2a/lambda-uneval13.C: New test. + * g++.dg/ext/attr-expr1.C: New test. + 2021-02-03 Jakub Jelinek PR preprocessor/98882 -- cgit v1.1 From b80fefd626460fb8924248622ba59dd56246703e Mon Sep 17 00:00:00 2001 From: liuhongt Date: Thu, 28 Jan 2021 14:07:00 +0800 Subject: =?UTF-8?q?Enable=20X86=5FTUNE=5FAVX256=5FUNALIGNED=5F{LOAD?= =?UTF-8?q?=EF=BC=8CSTORE}=5FOPTIMAL=20in=20generic=20tune.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gcc/ChangeLog: PR target/98172 * config/i386/x86-tune.def (X86_TUNE_AVX256_UNALIGNED_LOAD_OPTIMAL): Remove m_GENERIC from ~list. (X86_TUNE_AVX256_UNALIGNED_STORE_OPTIMAL): Ditto. --- gcc/config/i386/x86-tune.def | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'gcc') diff --git a/gcc/config/i386/x86-tune.def b/gcc/config/i386/x86-tune.def index 7ace8da..f0e07c0 100644 --- a/gcc/config/i386/x86-tune.def +++ b/gcc/config/i386/x86-tune.def @@ -453,12 +453,12 @@ DEF_TUNE (X86_TUNE_AVOID_256FMA_CHAINS, "avoid_fma256_chains", m_ZNVER2 | m_ZNVE /* X86_TUNE_AVX256_UNALIGNED_LOAD_OPTIMAL: if false, unaligned loads are split. */ DEF_TUNE (X86_TUNE_AVX256_UNALIGNED_LOAD_OPTIMAL, "256_unaligned_load_optimal", - ~(m_NEHALEM | m_SANDYBRIDGE | m_GENERIC)) + ~(m_NEHALEM | m_SANDYBRIDGE)) /* X86_TUNE_AVX256_UNALIGNED_STORE_OPTIMAL: if false, unaligned stores are split. */ DEF_TUNE (X86_TUNE_AVX256_UNALIGNED_STORE_OPTIMAL, "256_unaligned_store_optimal", - ~(m_NEHALEM | m_SANDYBRIDGE | m_BDVER | m_ZNVER1 | m_GENERIC)) + ~(m_NEHALEM | m_SANDYBRIDGE | m_BDVER | m_ZNVER1)) /* X86_TUNE_AVX256_SPLIT_REGS: if true, AVX256 ops are split into two AVX128 ops. */ DEF_TUNE (X86_TUNE_AVX256_SPLIT_REGS, "avx256_split_regs",m_BDVER | m_BTVER2 -- cgit v1.1 From 8d0737d8f4b10bffe0411507ad2dc21ba7679883 Mon Sep 17 00:00:00 2001 From: liuhongt Date: Thu, 7 Jan 2021 10:15:33 +0800 Subject: Fix ICE: Don't generate integer mask comparision for 128/256-bits vector when op_true/op_false are NULL or constm1_rtx/const0_rtx [PR98537] avx512vl-pr92686-vpcmp-{1,2,intelasm-1}.c are used to guard code generation of integer mask comparison, but for vector comparison to vector dest, integer mask comparison is disliked, so delete these useless tests. gcc/ChangeLog: PR target/98537 * config/i386/i386-expand.c (ix86_expand_sse_cmp): Don't generate integer mask comparison for 128/256-bits vector when op_true/op_false is NULL_RTX or CONSTM1_RTX/CONST0_RTX. Also delete redundant !maskcmp condition. (ix86_expand_int_vec_cmp): Ditto but no redundant deletion here. (ix86_expand_sse_movcc): Delete definition of maskcmp, add the condition directly to if (maskcmp), add extra check for cmpmode, it should be MODE_INT. (ix86_expand_fp_vec_cmp): Pass NULL to ix86_expand_sse_cmp's parameters op_true/op_false. (ix86_use_mask_cmp_p): New. gcc/testsuite/ChangeLog: PR target/98537 * g++.target/i386/avx512bw-pr98537-1.C: New test. * g++.target/i386/avx512vl-pr98537-1.C: New test. * g++.target/i386/avx512vl-pr98537-2.C: New test. * gcc.target/i386/avx512vl-pr88547-1.c: Adjust testcase, integer mask comparison should not be generated. * gcc.target/i386/avx512vl-pr92686-vpcmp-1.c: Remove. * gcc.target/i386/avx512vl-pr92686-vpcmp-2.c: Ditto. * gcc.target/i386/avx512vl-pr92686-vpcmp-intelasm-1.c: Ditto. --- gcc/config/i386/i386-expand.c | 43 ++++++-- gcc/testsuite/g++.target/i386/avx512bw-pr98537-1.C | 11 ++ gcc/testsuite/g++.target/i386/avx512vl-pr98537-1.C | 40 ++++++++ gcc/testsuite/g++.target/i386/avx512vl-pr98537-2.C | 8 ++ gcc/testsuite/gcc.target/i386/avx512vl-pr88547-1.c | 10 +- .../gcc.target/i386/avx512vl-pr92686-vpcmp-1.c | 112 --------------------- .../gcc.target/i386/avx512vl-pr92686-vpcmp-2.c | 91 ----------------- .../i386/avx512vl-pr92686-vpcmp-intelasm-1.c | 111 -------------------- 8 files changed, 100 insertions(+), 326 deletions(-) create mode 100644 gcc/testsuite/g++.target/i386/avx512bw-pr98537-1.C create mode 100644 gcc/testsuite/g++.target/i386/avx512vl-pr98537-1.C create mode 100644 gcc/testsuite/g++.target/i386/avx512vl-pr98537-2.C delete mode 100644 gcc/testsuite/gcc.target/i386/avx512vl-pr92686-vpcmp-1.c delete mode 100644 gcc/testsuite/gcc.target/i386/avx512vl-pr92686-vpcmp-2.c delete mode 100644 gcc/testsuite/gcc.target/i386/avx512vl-pr92686-vpcmp-intelasm-1.c (limited to 'gcc') diff --git a/gcc/config/i386/i386-expand.c b/gcc/config/i386/i386-expand.c index d64b4ac..02d3142 100644 --- a/gcc/config/i386/i386-expand.c +++ b/gcc/config/i386/i386-expand.c @@ -3469,6 +3469,33 @@ ix86_valid_mask_cmp_mode (machine_mode mode) return vector_size == 64 || TARGET_AVX512VL; } +/* Return true if integer mask comparison should be used. */ +static bool +ix86_use_mask_cmp_p (machine_mode mode, machine_mode cmp_mode, + rtx op_true, rtx op_false) +{ + if (GET_MODE_SIZE (mode) == 64) + return true; + + /* When op_true is NULL, op_false must be NULL, or vice versa. */ + gcc_assert (!op_true == !op_false); + + /* When op_true/op_false is NULL or cmp_mode is not valid mask cmp mode, + vector dest is required. */ + if (!op_true || !ix86_valid_mask_cmp_mode (cmp_mode)) + return false; + + /* Exclude those that could be optimized in ix86_expand_sse_movcc. */ + if (op_false == CONST0_RTX (mode) + || op_true == CONST0_RTX (mode) + || (INTEGRAL_MODE_P (mode) + && (op_true == CONSTM1_RTX (mode) + || op_false == CONSTM1_RTX (mode)))) + return false; + + return true; +} + /* Expand an SSE comparison. Return the register with the result. */ static rtx @@ -3485,7 +3512,7 @@ ix86_expand_sse_cmp (rtx dest, enum rtx_code code, rtx cmp_op0, rtx cmp_op1, bool maskcmp = false; rtx x; - if (ix86_valid_mask_cmp_mode (cmp_ops_mode)) + if (ix86_use_mask_cmp_p (mode, cmp_ops_mode, op_true, op_false)) { unsigned int nbits = GET_MODE_NUNITS (cmp_ops_mode); maskcmp = true; @@ -3517,7 +3544,7 @@ ix86_expand_sse_cmp (rtx dest, enum rtx_code code, rtx cmp_op0, rtx cmp_op1, x = gen_rtx_fmt_ee (code, cmp_mode, cmp_op0, cmp_op1); - if (cmp_mode != mode && !maskcmp) + if (cmp_mode != mode) { x = force_reg (cmp_ops_mode, x); convert_move (dest, x, false); @@ -3544,9 +3571,6 @@ ix86_expand_sse_movcc (rtx dest, rtx cmp, rtx op_true, rtx op_false) return; } - /* In AVX512F the result of comparison is an integer mask. */ - bool maskcmp = mode != cmpmode && ix86_valid_mask_cmp_mode (mode); - rtx t2, t3, x; /* If we have an integer mask and FP value then we need @@ -3557,8 +3581,11 @@ ix86_expand_sse_movcc (rtx dest, rtx cmp, rtx op_true, rtx op_false) cmp = gen_rtx_SUBREG (mode, cmp, 0); } - if (maskcmp) + /* In AVX512F the result of comparison is an integer mask. */ + if (mode != cmpmode + && GET_MODE_CLASS (cmpmode) == MODE_INT) { + gcc_assert (ix86_valid_mask_cmp_mode (mode)); /* Using vector move with mask register. */ cmp = force_reg (cmpmode, cmp); /* Optimize for mask zero. */ @@ -4016,7 +4043,7 @@ ix86_expand_fp_vec_cmp (rtx operands[]) } else cmp = ix86_expand_sse_cmp (operands[0], code, operands[2], operands[3], - operands[1], operands[2]); + NULL, NULL); if (operands[0] != cmp) emit_move_insn (operands[0], cmp); @@ -4041,7 +4068,7 @@ ix86_expand_int_sse_cmp (rtx dest, enum rtx_code code, rtx cop0, rtx cop1, ; /* AVX512F supports all of the comparsions on all 128/256/512-bit vector int types. */ - else if (ix86_valid_mask_cmp_mode (mode)) + else if (ix86_use_mask_cmp_p (data_mode, mode, op_true, op_false)) ; else { diff --git a/gcc/testsuite/g++.target/i386/avx512bw-pr98537-1.C b/gcc/testsuite/g++.target/i386/avx512bw-pr98537-1.C new file mode 100644 index 0000000..969684a --- /dev/null +++ b/gcc/testsuite/g++.target/i386/avx512bw-pr98537-1.C @@ -0,0 +1,11 @@ +/* PR target/98537 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -march=x86-64 -std=c++11" } */ + +#define TYPEV char +#define TYPEW short + +#define T_ARR \ + __attribute__ ((target ("avx512vl,avx512bw"))) + +#include "avx512vl-pr98537-1.C" diff --git a/gcc/testsuite/g++.target/i386/avx512vl-pr98537-1.C b/gcc/testsuite/g++.target/i386/avx512vl-pr98537-1.C new file mode 100644 index 0000000..b2ba911 --- /dev/null +++ b/gcc/testsuite/g++.target/i386/avx512vl-pr98537-1.C @@ -0,0 +1,40 @@ +/* PR target/98537 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -march=x86-64 -std=c++11" } */ + +#ifndef TYPEV +#define TYPEV int +#endif + +#ifndef TYPEW +#define TYPEW long long +#endif + +#ifndef T_ARR +#define T_ARR \ + __attribute__ ((target ("avx512vl"))) +#endif + +typedef TYPEV V __attribute__((__vector_size__(32))); +typedef TYPEW W __attribute__((__vector_size__(32))); + +W c, d; +struct B {}; +B e; +struct C { W i; }; +void foo (C); + +C +operator== (B, B) +{ + W r = (V)c == (V)d; + return {r}; +} + +void +T_ARR +bar () +{ + B a; + foo (a == e); +} diff --git a/gcc/testsuite/g++.target/i386/avx512vl-pr98537-2.C b/gcc/testsuite/g++.target/i386/avx512vl-pr98537-2.C new file mode 100644 index 0000000..42c9682 --- /dev/null +++ b/gcc/testsuite/g++.target/i386/avx512vl-pr98537-2.C @@ -0,0 +1,8 @@ +/* PR target/98537 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -march=x86-64 -std=c++11" } */ + +#define TYPEV float +#define TYPEW double + +#include "avx512vl-pr98537-1.C" diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-pr88547-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-pr88547-1.c index a3ffeca..af15a63 100644 --- a/gcc/testsuite/gcc.target/i386/avx512vl-pr88547-1.c +++ b/gcc/testsuite/gcc.target/i386/avx512vl-pr88547-1.c @@ -1,12 +1,14 @@ /* PR target/88547 */ /* { dg-do compile } */ -/* { dg-options "-O2 -mno-xop -mavx512vl -mno-avx512bw -mno-avx512dq" } */ +/* { dg-options "-O2 -mno-xop -mavx512vl -mavx512bw -mavx512dq" } */ /* { dg-final { scan-assembler-not "vpmingt\[bwdq]\[\t ]" } } */ +/* { dg-final { scan-assembler-not "%k\[0-9\]" } } */ /* { dg-final { scan-assembler-times "vpminub\[\t ]" 2 } } */ /* { dg-final { scan-assembler-times "vpminsb\[\t ]" 2 } } */ /* { dg-final { scan-assembler-times "vpminuw\[\t ]" 2 } } */ /* { dg-final { scan-assembler-times "vpminsw\[\t ]" 2 } } */ -/* { dg-final { scan-assembler-times "vpcmp\[dq\]\[\t ]" 4 } } */ -/* { dg-final { scan-assembler-times "vpcmpu\[dq\]\[\t ]" 4 } } */ -/* { dg-final { scan-assembler-times "vpternlog\[qd\]\[\t ]" 8 } } */ +/* { dg-final { scan-assembler-times "vpminud\[\t ]" 2 } } */ +/* { dg-final { scan-assembler-times "vpminsd\[\t ]" 2 } } */ +/* { dg-final { scan-assembler-times "vpminuq\[\t ]" 2 } } */ +/* { dg-final { scan-assembler-times "vpminsq\[\t ]" 2 } } */ #include "avx2-pr88547-1.c" diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-pr92686-vpcmp-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-pr92686-vpcmp-1.c deleted file mode 100644 index 5b79d4d..0000000 --- a/gcc/testsuite/gcc.target/i386/avx512vl-pr92686-vpcmp-1.c +++ /dev/null @@ -1,112 +0,0 @@ -/* PR target/88547 */ -/* { dg-do compile } */ -/* { dg-options "-O2 -mavx512bw -mavx512vl -mno-avx512dq -mno-xop" } */ -/* { dg-final { scan-assembler-times "vpcmp\[bwdq\]\[\t ]" 8 } } */ -/* { dg-final { scan-assembler-times "vpcmpu\[bwdq\]\[\t ]" 8 } } */ -/* { dg-final { scan-assembler-times "vpmovm2\[bw\]\[\t ]" 8 } } */ -/* { dg-final { scan-assembler-times "vpternlog\[dq\]\[\t ]" 8 } } */ - -typedef signed char v32qi __attribute__((vector_size(32))); -typedef unsigned char v32uqi __attribute__((vector_size(32))); -typedef short v16hi __attribute__((vector_size(32))); -typedef unsigned short v16uhi __attribute__((vector_size(32))); -typedef int v8si __attribute__((vector_size(32))); -typedef unsigned v8usi __attribute__((vector_size(32))); -typedef long long v4di __attribute__((vector_size(32))); -typedef unsigned long long v4udi __attribute__((vector_size(32))); - -__attribute__((noipa)) v32qi -f1 (v32qi x, v32qi y) -{ - return x >= y; -} - -__attribute__((noipa)) v32uqi -f2 (v32uqi x, v32uqi y) -{ - return x >= y; -} - -__attribute__((noipa)) v32qi -f3 (v32qi x, v32qi y) -{ - return x <= y; -} - -__attribute__((noipa)) v32uqi -f4 (v32uqi x, v32uqi y) -{ - return x <= y; -} - -__attribute__((noipa)) v16hi -f5 (v16hi x, v16hi y) -{ - return x >= y; -} - -__attribute__((noipa)) v16uhi -f6 (v16uhi x, v16uhi y) -{ - return x >= y; -} - -__attribute__((noipa)) v16hi -f7 (v16hi x, v16hi y) -{ - return x <= y; -} - -__attribute__((noipa)) v16uhi -f8 (v16uhi x, v16uhi y) -{ - return x <= y; -} - -__attribute__((noipa)) v8si -f9 (v8si x, v8si y) -{ - return x >= y; -} - -__attribute__((noipa)) v8usi -f10 (v8usi x, v8usi y) -{ - return x >= y; -} - -__attribute__((noipa)) v8si -f11 (v8si x, v8si y) -{ - return x <= y; -} - -__attribute__((noipa)) v8usi -f12 (v8usi x, v8usi y) -{ - return x <= y; -} - -__attribute__((noipa)) v4di -f13 (v4di x, v4di y) -{ - return x >= y; -} - -__attribute__((noipa)) v4udi -f14 (v4udi x, v4udi y) -{ - return x >= y; -} - -__attribute__((noipa)) v4di -f15 (v4di x, v4di y) -{ - return x <= y; -} - -__attribute__((noipa)) v4udi -f16 (v4udi x, v4udi y) -{ - return x <= y; -} diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-pr92686-vpcmp-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-pr92686-vpcmp-2.c deleted file mode 100644 index 6be24ff..0000000 --- a/gcc/testsuite/gcc.target/i386/avx512vl-pr92686-vpcmp-2.c +++ /dev/null @@ -1,91 +0,0 @@ -/* { dg-do run } */ -/* { dg-require-effective-target avx512bw } */ -/* { dg-require-effective-target avx512vl } */ -/* { dg-options "-O2 -mavx512bw -mavx512vl" } */ - -#ifndef CHECK -#define CHECK "avx512f-helper.h" -#endif - -#include CHECK - -#ifndef TEST -#define TEST avx512vl_test -#endif - -#include "avx512vl-pr92686-vpcmp-1.c" - -#define NUM 256 - -#define TEST_SIGNED(vtype, type, N, fn, op) \ -do \ - { \ - union { vtype x[NUM / N]; type i[NUM]; } dst, src1, src2; \ - int i, sign = 1; \ - type res; \ - for (i = 0; i < NUM; i++) \ - { \ - src1.i[i] = i * i * sign; \ - src2.i[i] = (i + 20) * sign; \ - sign = -sign; \ - } \ - for (i = 0; i < NUM; i += N) \ - dst.x[i / N] = fn (src1.x[i / N], src2.x[i / N]); \ - \ - for (i = 0; i < NUM; i++) \ - { \ - res = src1.i[i] op src2.i[i] ? -1 : 0; \ - if (res != dst.i[i]) \ - abort (); \ - } \ - } \ -while (0) - -#define TEST_UNSIGNED(vtype, type, N, fn, op) \ -do \ - { \ - union { vtype x[NUM / N]; type i[NUM]; } dst, src1, src2; \ - int i; \ - type res; \ - \ - for (i = 0; i < NUM; i++) \ - { \ - src1.i[i] = i * i; \ - src2.i[i] = i + 20; \ - if ((i % 4)) \ - src2.i[i] |= (1ULL << (sizeof (type) \ - * __CHAR_BIT__ - 1)); \ - } \ - \ - for (i = 0; i < NUM; i += N) \ - dst.x[i / N] = fn (src1.x[i / N], src2.x[i / N]); \ - \ - for (i = 0; i < NUM; i++) \ - { \ - res = src1.i[i] op src2.i[i] ? -1 : 0; \ - if (res != dst.i[i]) \ - abort (); \ - } \ - } \ -while (0) - -static void -TEST (void) -{ - TEST_SIGNED (v32qi, signed char, 32, f1, >=); - TEST_UNSIGNED (v32uqi, unsigned char, 32, f2, >=); - TEST_SIGNED (v32qi, signed char, 32, f3, <=); - TEST_UNSIGNED (v32uqi, unsigned char, 32, f4, <=); - TEST_SIGNED (v16hi, short int, 16, f5, >=); - TEST_UNSIGNED (v16uhi, unsigned short int, 16, f6, >=); - TEST_SIGNED (v16hi, short int, 16, f7, <=); - TEST_UNSIGNED (v16uhi, unsigned short int, 16, f8, <=); - TEST_SIGNED (v8si, int, 8, f9, >=); - TEST_UNSIGNED (v8usi, unsigned int, 8, f10, >=); - TEST_SIGNED (v8si, int, 8, f11, <=); - TEST_UNSIGNED (v8usi, unsigned int, 8, f12, <=); - TEST_SIGNED (v4di, long long int, 4, f13, >=); - TEST_UNSIGNED (v4udi, unsigned long long int, 4, f14, >=); - TEST_SIGNED (v4di, long long int, 4, f15, <=); - TEST_UNSIGNED (v4udi, unsigned long long int, 4, f16, <=); -} diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-pr92686-vpcmp-intelasm-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-pr92686-vpcmp-intelasm-1.c deleted file mode 100644 index 907386d..0000000 --- a/gcc/testsuite/gcc.target/i386/avx512vl-pr92686-vpcmp-intelasm-1.c +++ /dev/null @@ -1,111 +0,0 @@ -/* PR target/88547 */ -/* { dg-do assemble } */ -/* { dg-require-effective-target masm_intel } */ -/* { dg-options "-O2 -mavx512bw -mavx512vl -mno-avx512dq -mno-xop -masm=intel" } */ -/* { dg-require-effective-target avx512bw } */ -/* { dg-require-effective-target avx512vl } */ - -typedef signed char v32qi __attribute__((vector_size(32))); -typedef unsigned char v32uqi __attribute__((vector_size(32))); -typedef short v16hi __attribute__((vector_size(32))); -typedef unsigned short v16uhi __attribute__((vector_size(32))); -typedef int v8si __attribute__((vector_size(32))); -typedef unsigned v8usi __attribute__((vector_size(32))); -typedef long long v4di __attribute__((vector_size(32))); -typedef unsigned long long v4udi __attribute__((vector_size(32))); - -__attribute__((noipa)) v32qi -f1 (v32qi x, v32qi y) -{ - return x >= y; -} - -__attribute__((noipa)) v32uqi -f2 (v32uqi x, v32uqi y) -{ - return x >= y; -} - -__attribute__((noipa)) v32qi -f3 (v32qi x, v32qi y) -{ - return x <= y; -} - -__attribute__((noipa)) v32uqi -f4 (v32uqi x, v32uqi y) -{ - return x <= y; -} - -__attribute__((noipa)) v16hi -f5 (v16hi x, v16hi y) -{ - return x >= y; -} - -__attribute__((noipa)) v16uhi -f6 (v16uhi x, v16uhi y) -{ - return x >= y; -} - -__attribute__((noipa)) v16hi -f7 (v16hi x, v16hi y) -{ - return x <= y; -} - -__attribute__((noipa)) v16uhi -f8 (v16uhi x, v16uhi y) -{ - return x <= y; -} - -__attribute__((noipa)) v8si -f9 (v8si x, v8si y) -{ - return x >= y; -} - -__attribute__((noipa)) v8usi -f10 (v8usi x, v8usi y) -{ - return x >= y; -} - -__attribute__((noipa)) v8si -f11 (v8si x, v8si y) -{ - return x <= y; -} - -__attribute__((noipa)) v8usi -f12 (v8usi x, v8usi y) -{ - return x <= y; -} - -__attribute__((noipa)) v4di -f13 (v4di x, v4di y) -{ - return x >= y; -} - -__attribute__((noipa)) v4udi -f14 (v4udi x, v4udi y) -{ - return x >= y; -} - -__attribute__((noipa)) v4di -f15 (v4di x, v4di y) -{ - return x <= y; -} - -__attribute__((noipa)) v4udi -f16 (v4udi x, v4udi y) -{ - return x <= y; -} -- cgit v1.1 From 072f20c555907cce38a424da47b6c1baa8330169 Mon Sep 17 00:00:00 2001 From: Kito Cheng Date: Thu, 28 Jan 2021 18:29:53 +0800 Subject: PR target/98878 - Incorrect multilib list for riscv*-rtems - Multi-lib only check the default argument is appeared in the multilib flag list, but we didn't check the case that the flag is required but default argument didn't provide. - For example riscv*-rtems has a multilib set: rv32imafd/ilp32d;@march=rv32imafd@mabi=ilp32d And when we set the default argument of arch to rv32imafdc and ABI to ilp32d, gcc will check the ilp32d is matched, but it didn't check rv32imafd is not provided by default arguments, so it should not reuse default library. - The side effcet of this patch is csky-elf target will increase the number of multilib from 54 to 59, but it's because genmultilib didn't know the default argument for multilib, so I think it could be improved in future. gcc/ChangeLog: * gcc.c (print_multilib_info): Check all required argument is provided by default arg. --- gcc/gcc.c | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) (limited to 'gcc') diff --git a/gcc/gcc.c b/gcc/gcc.c index aa5774a..76f1d42 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -9909,12 +9909,14 @@ print_multilib_info (void) last_path_len = p - this_path; } - /* If this directory requires any default arguments, we can skip - it. We will already have printed a directory identical to - this one which does not require that default argument. */ + /* If all required arguments are default arguments, and no default + arguments appear in the ! argument list, then we can skip it. + We will already have printed a directory identical to this one + which does not require that default argument. */ if (! skip) { const char *q; + bool default_arg_ok = false; q = p + 1; while (*q != ';') @@ -9946,16 +9948,29 @@ print_multilib_info (void) list. */ if (not_arg) { - skip = 0; + default_arg_ok = false; break; } - else - skip = 1; + + default_arg_ok = true; + } + else if (!not_arg) + { + /* Stop checking if any required argument is not provided by + default arguments. */ + default_arg_ok = false; + break; } if (*q == ' ') ++q; } + + /* Make sure all default argument is OK for this multi-lib set. */ + if (default_arg_ok) + skip = 1; + else + skip = 0; } if (! skip) -- cgit v1.1 From b6e7a7498732b83df61443c211b8d69454ad0b22 Mon Sep 17 00:00:00 2001 From: Kyrylo Tkachov Date: Fri, 5 Feb 2021 08:14:07 +0000 Subject: aarch64: Reimplement vget_low* intrinsics We can do better on the vget_low* intrinsics. Currently they reinterpret their argument into a V2DI vector and extract the low "lane", reinterpreting that back into the shorter vector. This is functionally correct and generates a sequence of subregs and a vec_select that, by itself, gets optimised away eventually. However it's bad when we want to use the result in a other SIMD operations. Then the subreg-vec_select-subreg combo blocks many combine patterns. This patch reimplements them to emit a proper low vec_select from the start. It generates much cleaner RTL and allows for more aggressive combinations, particularly with the patterns that Jonathan has been pushing lately. gcc/ChangeLog: * config/aarch64/aarch64-simd-builtins.def (get_low): Define builtin. * config/aarch64/aarch64-simd.md (aarch64_get_low): Define. * config/aarch64/arm_neon.h (__GET_LOW): Delete. (vget_low_f16): Reimplement using new builtin. (vget_low_f32): Likewise. (vget_low_f64): Likewise. (vget_low_p8): Likewise. (vget_low_p16): Likewise. (vget_low_p64): Likewise. (vget_low_s8): Likewise. (vget_low_s16): Likewise. (vget_low_s32): Likewise. (vget_low_s64): Likewise. (vget_low_u8): Likewise. (vget_low_u16): Likewise. (vget_low_u32): Likewise. (vget_low_u64): Likewise. --- gcc/config/aarch64/aarch64-simd-builtins.def | 3 +++ gcc/config/aarch64/aarch64-simd.md | 11 +++++++++ gcc/config/aarch64/arm_neon.h | 35 +++++++++++----------------- 3 files changed, 28 insertions(+), 21 deletions(-) (limited to 'gcc') diff --git a/gcc/config/aarch64/aarch64-simd-builtins.def b/gcc/config/aarch64/aarch64-simd-builtins.def index 29a7bbc..66420cf 100644 --- a/gcc/config/aarch64/aarch64-simd-builtins.def +++ b/gcc/config/aarch64/aarch64-simd-builtins.def @@ -55,6 +55,9 @@ BUILTIN_VS (UNOP, ctz, 2, NONE) BUILTIN_VB (UNOP, popcount, 2, NONE) + /* Implemented by aarch64_get_low. */ + BUILTIN_VQMOV (UNOP, get_low, 0, AUTO_FP) + /* Implemented by aarch64_qshl. */ BUILTIN_VSDQ_I (BINOP, sqshl, 0, NONE) BUILTIN_VSDQ_I (BINOP_UUS, uqshl, 0, NONE) diff --git a/gcc/config/aarch64/aarch64-simd.md b/gcc/config/aarch64/aarch64-simd.md index 60eeddc..e730ff5 100644 --- a/gcc/config/aarch64/aarch64-simd.md +++ b/gcc/config/aarch64/aarch64-simd.md @@ -297,6 +297,17 @@ "TARGET_SIMD" ) +(define_expand "aarch64_get_low" + [(match_operand: 0 "register_operand") + (match_operand:VQMOV 1 "register_operand")] + "TARGET_SIMD" + { + rtx lo = aarch64_simd_vect_par_cnst_half (mode, , false); + emit_insn (gen_aarch64_get_half (operands[0], operands[1], lo)); + DONE; + } +) + (define_insn_and_split "aarch64_simd_mov_from_low" [(set (match_operand: 0 "register_operand" "=w,?r") (vec_select: diff --git a/gcc/config/aarch64/arm_neon.h b/gcc/config/aarch64/arm_neon.h index 2d776ef..67c7f24 100644 --- a/gcc/config/aarch64/arm_neon.h +++ b/gcc/config/aarch64/arm_neon.h @@ -6302,111 +6302,104 @@ vsetq_lane_u64 (uint64_t __elem, uint64x2_t __vec, const int __index) return __aarch64_vset_lane_any (__elem, __vec, __index); } -#define __GET_LOW(__TYPE) \ - uint64x2_t tmp = vreinterpretq_u64_##__TYPE (__a); \ - uint64x1_t lo = vcreate_u64 (vgetq_lane_u64 (tmp, 0)); \ - return vreinterpret_##__TYPE##_u64 (lo); - __extension__ extern __inline float16x4_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vget_low_f16 (float16x8_t __a) { - __GET_LOW (f16); + return __builtin_aarch64_get_lowv8hf (__a); } __extension__ extern __inline float32x2_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vget_low_f32 (float32x4_t __a) { - __GET_LOW (f32); + return __builtin_aarch64_get_lowv4sf (__a); } __extension__ extern __inline float64x1_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vget_low_f64 (float64x2_t __a) { - return (float64x1_t) {vgetq_lane_f64 (__a, 0)}; + return (float64x1_t) {__builtin_aarch64_get_lowv2df (__a)}; } __extension__ extern __inline poly8x8_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vget_low_p8 (poly8x16_t __a) { - __GET_LOW (p8); + return (poly8x8_t) __builtin_aarch64_get_lowv16qi ((int8x16_t) __a); } __extension__ extern __inline poly16x4_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vget_low_p16 (poly16x8_t __a) { - __GET_LOW (p16); + return (poly16x4_t) __builtin_aarch64_get_lowv8hi ((int16x8_t) __a); } __extension__ extern __inline poly64x1_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vget_low_p64 (poly64x2_t __a) { - __GET_LOW (p64); + return (poly64x1_t) __builtin_aarch64_get_lowv2di ((int64x2_t) __a); } __extension__ extern __inline int8x8_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vget_low_s8 (int8x16_t __a) { - __GET_LOW (s8); + return __builtin_aarch64_get_lowv16qi (__a); } __extension__ extern __inline int16x4_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vget_low_s16 (int16x8_t __a) { - __GET_LOW (s16); + return __builtin_aarch64_get_lowv8hi (__a); } __extension__ extern __inline int32x2_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vget_low_s32 (int32x4_t __a) { - __GET_LOW (s32); + return __builtin_aarch64_get_lowv4si (__a); } __extension__ extern __inline int64x1_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vget_low_s64 (int64x2_t __a) { - __GET_LOW (s64); + return (int64x1_t) {__builtin_aarch64_get_lowv2di (__a)}; } __extension__ extern __inline uint8x8_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vget_low_u8 (uint8x16_t __a) { - __GET_LOW (u8); + return (uint8x8_t) __builtin_aarch64_get_lowv16qi ((int8x16_t) __a); } __extension__ extern __inline uint16x4_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vget_low_u16 (uint16x8_t __a) { - __GET_LOW (u16); + return (uint16x4_t) __builtin_aarch64_get_lowv8hi ((int16x8_t) __a); } __extension__ extern __inline uint32x2_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vget_low_u32 (uint32x4_t __a) { - __GET_LOW (u32); + return (uint32x2_t) __builtin_aarch64_get_lowv4si ((int32x4_t) __a); } __extension__ extern __inline uint64x1_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vget_low_u64 (uint64x2_t __a) { - return vcreate_u64 (vgetq_lane_u64 (__a, 0)); + return (uint64x1_t) {__builtin_aarch64_get_lowv2di ((int64x2_t) __a)}; } -#undef __GET_LOW - #define __GET_HIGH(__TYPE) \ uint64x2_t tmp = vreinterpretq_u64_##__TYPE (__a); \ uint64x1_t hi = vcreate_u64 (vgetq_lane_u64 (tmp, 1)); \ -- cgit v1.1 From d9bb52150db4eb282bd8adf0397e848373f85a70 Mon Sep 17 00:00:00 2001 From: Kyrylo Tkachov Date: Fri, 5 Feb 2021 09:17:57 +0000 Subject: aarch64: Reimplement vget_high* intrinsics Similar to the vget_low* intrinsics we should just use a proper vec_select rather than going through V2DI subregs. gcc/ChangeLog: * config/aarch64/aarch64-simd-builtins.def (get_high): Define builtin. * config/aarch64/aarch64-simd.md (aarch64_get_high): Define. * config/aarch64/arm_neon.h (__GET_HIGH): Delete. (vget_high_f16): Reimplement using new builtin. (vget_high_f32): Likewise. (vget_high_f64): Likewise. (vget_high_p8): Likewise. (vget_high_p16): Likewise. (vget_high_p64): Likewise. (vget_high_s8): Likewise. (vget_high_s16): Likewise. (vget_high_s32): Likewise. (vget_high_s64): Likewise. (vget_high_u8): Likewise. (vget_high_u16): Likewise. (vget_high_u32): Likewise. (vget_high_u64): Likewise. --- gcc/config/aarch64/aarch64-simd-builtins.def | 2 ++ gcc/config/aarch64/aarch64-simd.md | 11 +++++++++ gcc/config/aarch64/arm_neon.h | 36 ++++++++++++---------------- 3 files changed, 28 insertions(+), 21 deletions(-) (limited to 'gcc') diff --git a/gcc/config/aarch64/aarch64-simd-builtins.def b/gcc/config/aarch64/aarch64-simd-builtins.def index 66420cf..b885bd5 100644 --- a/gcc/config/aarch64/aarch64-simd-builtins.def +++ b/gcc/config/aarch64/aarch64-simd-builtins.def @@ -57,6 +57,8 @@ /* Implemented by aarch64_get_low. */ BUILTIN_VQMOV (UNOP, get_low, 0, AUTO_FP) + /* Implemented by aarch64_get_high. */ + BUILTIN_VQMOV (UNOP, get_high, 0, AUTO_FP) /* Implemented by aarch64_qshl. */ BUILTIN_VSDQ_I (BINOP, sqshl, 0, NONE) diff --git a/gcc/config/aarch64/aarch64-simd.md b/gcc/config/aarch64/aarch64-simd.md index e730ff5..71aa77d 100644 --- a/gcc/config/aarch64/aarch64-simd.md +++ b/gcc/config/aarch64/aarch64-simd.md @@ -308,6 +308,17 @@ } ) +(define_expand "aarch64_get_high" + [(match_operand: 0 "register_operand") + (match_operand:VQMOV 1 "register_operand")] + "TARGET_SIMD" + { + rtx hi = aarch64_simd_vect_par_cnst_half (mode, , true); + emit_insn (gen_aarch64_get_half (operands[0], operands[1], hi)); + DONE; + } +) + (define_insn_and_split "aarch64_simd_mov_from_low" [(set (match_operand: 0 "register_operand" "=w,?r") (vec_select: diff --git a/gcc/config/aarch64/arm_neon.h b/gcc/config/aarch64/arm_neon.h index 67c7f24..baa30bd 100644 --- a/gcc/config/aarch64/arm_neon.h +++ b/gcc/config/aarch64/arm_neon.h @@ -6400,111 +6400,105 @@ vget_low_u64 (uint64x2_t __a) return (uint64x1_t) {__builtin_aarch64_get_lowv2di ((int64x2_t) __a)}; } -#define __GET_HIGH(__TYPE) \ - uint64x2_t tmp = vreinterpretq_u64_##__TYPE (__a); \ - uint64x1_t hi = vcreate_u64 (vgetq_lane_u64 (tmp, 1)); \ - return vreinterpret_##__TYPE##_u64 (hi); - __extension__ extern __inline float16x4_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vget_high_f16 (float16x8_t __a) { - __GET_HIGH (f16); + return __builtin_aarch64_get_highv8hf (__a); } __extension__ extern __inline float32x2_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vget_high_f32 (float32x4_t __a) { - __GET_HIGH (f32); + return __builtin_aarch64_get_highv4sf (__a); } __extension__ extern __inline float64x1_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vget_high_f64 (float64x2_t __a) { - __GET_HIGH (f64); + return (float64x1_t) {__builtin_aarch64_get_highv2df (__a)}; } __extension__ extern __inline poly8x8_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vget_high_p8 (poly8x16_t __a) { - __GET_HIGH (p8); + return (poly8x8_t) __builtin_aarch64_get_highv16qi ((int8x16_t) __a); } __extension__ extern __inline poly16x4_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vget_high_p16 (poly16x8_t __a) { - __GET_HIGH (p16); + return (poly16x4_t) __builtin_aarch64_get_highv8hi ((int16x8_t) __a); } __extension__ extern __inline poly64x1_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vget_high_p64 (poly64x2_t __a) { - __GET_HIGH (p64); + return (poly64x1_t) __builtin_aarch64_get_highv2di ((int64x2_t) __a); } __extension__ extern __inline int8x8_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vget_high_s8 (int8x16_t __a) { - __GET_HIGH (s8); + return __builtin_aarch64_get_highv16qi (__a); } __extension__ extern __inline int16x4_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vget_high_s16 (int16x8_t __a) { - __GET_HIGH (s16); + return __builtin_aarch64_get_highv8hi (__a); } __extension__ extern __inline int32x2_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vget_high_s32 (int32x4_t __a) { - __GET_HIGH (s32); + return __builtin_aarch64_get_highv4si (__a); } __extension__ extern __inline int64x1_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vget_high_s64 (int64x2_t __a) { - __GET_HIGH (s64); + return (int64x1_t) {__builtin_aarch64_get_highv2di (__a)}; } __extension__ extern __inline uint8x8_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vget_high_u8 (uint8x16_t __a) { - __GET_HIGH (u8); + return (uint8x8_t) __builtin_aarch64_get_highv16qi ((int8x16_t) __a); } __extension__ extern __inline uint16x4_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vget_high_u16 (uint16x8_t __a) { - __GET_HIGH (u16); + return (uint16x4_t) __builtin_aarch64_get_highv8hi ((int16x8_t) __a); } __extension__ extern __inline uint32x2_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vget_high_u32 (uint32x4_t __a) { - __GET_HIGH (u32); + return (uint32x2_t) __builtin_aarch64_get_highv4si ((int32x4_t) __a); } -#undef __GET_HIGH - __extension__ extern __inline uint64x1_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vget_high_u64 (uint64x2_t __a) { - return vcreate_u64 (vgetq_lane_u64 (__a, 1)); + return (uint64x1_t) {__builtin_aarch64_get_highv2di ((int64x2_t) __a)}; } + __extension__ extern __inline int8x16_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vcombine_s8 (int8x8_t __a, int8x8_t __b) -- cgit v1.1 From b229baa75ce4627d1bd38f2d3dcd91af1a7071db Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 5 Feb 2021 10:22:07 +0100 Subject: c++: Fix ICE with structured binding initialized to incomplete array [PR97878] We ICE on the following testcase, for incomplete array a on auto [b] { a }; without giving any kind of diagnostics, with auto [c] = a; during error-recovery. The problem is that we get too far through check_initializer and e.g. store_init_value -> constexpr stuff can't deal with incomplete array types. As the type of the structured binding artificial variable is always deduced, I think it is easiest to diagnose this early, even if they have array types we'll need their deduced type to be complete rather than just its element type. 2021-02-05 Jakub Jelinek PR c++/97878 * decl.c (check_array_initializer): For structured bindings, require the array type to be complete. * g++.dg/cpp1z/decomp54.C: New test. --- gcc/cp/decl.c | 13 +++++++++++++ gcc/testsuite/g++.dg/cpp1z/decomp54.C | 17 +++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp1z/decomp54.C (limited to 'gcc') diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 3b9875e..b0265fc 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -6768,6 +6768,19 @@ check_array_initializer (tree decl, tree type, tree init) { tree element_type = TREE_TYPE (type); + /* Structured binding when initialized with an array type needs + to have complete type. */ + if (decl + && DECL_DECOMPOSITION_P (decl) + && !DECL_DECOMP_BASE (decl) + && !COMPLETE_TYPE_P (type)) + { + error_at (DECL_SOURCE_LOCATION (decl), + "structured binding has incomplete type %qT", type); + TREE_TYPE (decl) = error_mark_node; + return true; + } + /* The array type itself need not be complete, because the initializer may tell us how many elements are in the array. But, the elements of the array must be complete. */ diff --git a/gcc/testsuite/g++.dg/cpp1z/decomp54.C b/gcc/testsuite/g++.dg/cpp1z/decomp54.C new file mode 100644 index 0000000..1bee772 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/decomp54.C @@ -0,0 +1,17 @@ +// PR c++/97878 +// { dg-do compile { target c++11 } } +// { dg-options "" } + +extern int a[]; +auto [b] { a }; // { dg-error "has incomplete type" } + // { dg-warning "only available with" "" { target c++14_down } .-1 } +auto [c] = a; // { dg-error "has incomplete type" } + // { dg-warning "only available with" "" { target c++14_down } .-1 } +extern int d[0]; +auto [e] { d }; // { dg-error "too many initializers for" } + // { dg-error "1 name provided for structured binding" "" { target *-*-* } .-1 } + // { dg-message "decomposes into 0 elements" "" { target *-*-* } .-2 } + // { dg-warning "only available with" "" { target c++14_down } .-3 } +auto [f] = d; // { dg-error "1 name provided for structured binding" } + // { dg-message "decomposes into 0 elements" "" { target *-*-* } .-1 } + // { dg-warning "only available with" "" { target c++14_down } .-2 } -- cgit v1.1 From 37876976b0511ec96741f638f160874f2added0e Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 5 Feb 2021 10:39:03 +0100 Subject: i386: Fix up TARGET_QIMODE_MATH for many AMD CPU tunings [PR98957] As written in the PR, TARGET_QIMODE_MATH was meant to be set for all tunings and it was the case for GCC <= 7, but as the number of PROCESSOR_* enumerators grew, some AMD tunings (which are at the end of the list) over time got enumerators with values >= 32 and TARGET_QIMODE_MATH became disabled for them, in GCC 8 for 2 tunings, in GCC 9 for 7 tunings, in GCC 10 for 8 tunings, and on the trunk for 11 tunings. The following patch fixes it by using uhwis rather than uints and gives them also symbolic names. 2021-02-05 Jakub Jelinek PR target/98957 * config/i386/i386-options.c (m_NONE, m_ALL): Define. * config/i386/x86-tune.def (X86_TUNE_BRANCH_PREDICTION_HINTS, X86_TUNE_PROMOTE_QI_REGS): Use m_NONE instead of 0U. (X86_TUNE_QIMODE_MATH): Use m_ALL instead of ~0U. --- gcc/config/i386/i386-options.c | 2 ++ gcc/config/i386/x86-tune.def | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) (limited to 'gcc') diff --git a/gcc/config/i386/i386-options.c b/gcc/config/i386/i386-options.c index a70f6ed..cdeabbf 100644 --- a/gcc/config/i386/i386-options.c +++ b/gcc/config/i386/i386-options.c @@ -98,6 +98,8 @@ along with GCC; see the file COPYING3. If not see #endif /* Processor feature/optimization bitmasks. */ +#define m_NONE HOST_WIDE_INT_0U +#define m_ALL (~HOST_WIDE_INT_0U) #define m_386 (HOST_WIDE_INT_1U< Date: Fri, 5 Feb 2021 10:36:38 +0100 Subject: debug: fix switch lowering debug info gcc/ChangeLog: PR debug/98656 * tree-switch-conversion.c (jump_table_cluster::emit): Add loc argument. (bit_test_cluster::emit): Reuse location_t for newly created gswitch statement. (switch_decision_tree::try_switch_expansion): Preserve location_t. * tree-switch-conversion.h: Change function signatures. --- gcc/tree-switch-conversion.c | 11 +++++++---- gcc/tree-switch-conversion.h | 8 ++++---- 2 files changed, 11 insertions(+), 8 deletions(-) (limited to 'gcc') diff --git a/gcc/tree-switch-conversion.c b/gcc/tree-switch-conversion.c index 24dbad9..a479881 100644 --- a/gcc/tree-switch-conversion.c +++ b/gcc/tree-switch-conversion.c @@ -1112,7 +1112,8 @@ group_cluster::dump (FILE *f, bool details) void jump_table_cluster::emit (tree index_expr, tree, - tree default_label_expr, basic_block default_bb) + tree default_label_expr, basic_block default_bb, + location_t loc) { unsigned HOST_WIDE_INT range = get_range (get_low (), get_high ()); unsigned HOST_WIDE_INT nondefault_range = 0; @@ -1131,6 +1132,7 @@ jump_table_cluster::emit (tree index_expr, tree, gswitch *s = gimple_build_switch (index_expr, unshare_expr (default_label_expr), labels); + gimple_set_location (s, loc); gimple_stmt_iterator gsi = gsi_start_bb (m_case_bb); gsi_insert_after (&gsi, s, GSI_NEW_STMT); @@ -1491,7 +1493,7 @@ case_bit_test::cmp (const void *p1, const void *p2) void bit_test_cluster::emit (tree index_expr, tree index_type, - tree, basic_block default_bb) + tree, basic_block default_bb, location_t) { case_bit_test test[m_max_case_bit_tests] = { {} }; unsigned int i, j, k; @@ -1892,7 +1894,8 @@ switch_decision_tree::try_switch_expansion (vec &clusters) { cluster *c = clusters[0]; c->emit (index_expr, index_type, - gimple_switch_default_label (m_switch), m_default_bb); + gimple_switch_default_label (m_switch), m_default_bb, + gimple_location (m_switch)); redirect_edge_succ (single_succ_edge (bb), c->m_case_bb); } else @@ -1904,7 +1907,7 @@ switch_decision_tree::try_switch_expansion (vec &clusters) if (clusters[i]->get_type () != SIMPLE_CASE) clusters[i]->emit (index_expr, index_type, gimple_switch_default_label (m_switch), - m_default_bb); + m_default_bb, gimple_location (m_switch)); } fix_phi_operands_for_edges (); diff --git a/gcc/tree-switch-conversion.h b/gcc/tree-switch-conversion.h index d31fdf7..d3d568e 100644 --- a/gcc/tree-switch-conversion.h +++ b/gcc/tree-switch-conversion.h @@ -71,7 +71,7 @@ public: virtual void dump (FILE *f, bool details = false) = 0; /* Emit GIMPLE code to handle the cluster. */ - virtual void emit (tree, tree, tree, basic_block) = 0; + virtual void emit (tree, tree, tree, basic_block, location_t) = 0; /* Return true if a cluster handles only a single case value and the value is not a range. */ @@ -170,7 +170,7 @@ public: fprintf (f, " "); } - void emit (tree, tree, tree, basic_block) + void emit (tree, tree, tree, basic_block, location_t) { gcc_unreachable (); } @@ -260,7 +260,7 @@ public: } void emit (tree index_expr, tree index_type, - tree default_label_expr, basic_block default_bb); + tree default_label_expr, basic_block default_bb, location_t loc); /* Find jump tables of given CLUSTERS, where all members of the vector are of type simple_cluster. New clusters are returned. */ @@ -378,7 +378,7 @@ public: There *MUST* be max_case_bit_tests or less unique case node targets. */ void emit (tree index_expr, tree index_type, - tree default_label_expr, basic_block default_bb); + tree default_label_expr, basic_block default_bb, location_t loc); /* Find bit tests of given CLUSTERS, where all members of the vector are of type simple_cluster. New clusters are returned. */ -- cgit v1.1 From 63538886d1f7fc7cbf066b4c2d6d7fd4da537259 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Fri, 5 Feb 2021 09:54:00 +0100 Subject: tree-optimization/98855 - redo BB vectorization costing The following attempts to account for the fact that BB vectorization regions now can span multiple loop levels and that an unprofitable inner loop vectorization shouldn't be offsetted by a profitable outer loop vectorization to make it overall profitable. For now I've implemented a heuristic based on the premise that vectorization should be profitable even if loops may not be entered or if they iterate any number of times. Especially the first assumption then requires that stmts directly belonging to loop A need to be costed separately from stmts belonging to another loop which also simplifies the implementation. On x86 the added testcase has in the outer loop t.c:38:20: note: Cost model analysis for part in loop 1: Vector cost: 56 Scalar cost: 192 and the inner loop t.c:38:20: note: Cost model analysis for part in loop 2: Vector cost: 132 Scalar cost: 48 and thus the vectorization is considered not profitable (note the same would happen in case the 2nd cost were for a loop outer to the 1st costing). Future enhancements may consider static knowledge of whether a loop is always entered which would allow some inefficiency in the vectorization of its loop header. Likewise stmts only reachable from a loop exit can be treated this way. 2021-02-05 Richard Biener PR tree-optimization/98855 * tree-vectorizer.h (add_stmt_cost): New overload. * tree-vect-slp.c (li_cost_vec_cmp): New. (vect_bb_slp_scalar_cost): Cost individual loop regions separately. Account for the scalar instance root stmt. * g++.dg/vect/slp-pr98855.cc: New testcase. --- gcc/testsuite/g++.dg/vect/slp-pr98855.cc | 84 +++++++++++++++ gcc/tree-vect-slp.c | 173 +++++++++++++++++++++++++------ gcc/tree-vectorizer.h | 9 ++ 3 files changed, 232 insertions(+), 34 deletions(-) create mode 100644 gcc/testsuite/g++.dg/vect/slp-pr98855.cc (limited to 'gcc') diff --git a/gcc/testsuite/g++.dg/vect/slp-pr98855.cc b/gcc/testsuite/g++.dg/vect/slp-pr98855.cc new file mode 100644 index 0000000..0b4e479 --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/slp-pr98855.cc @@ -0,0 +1,84 @@ +// { dg-do compile } +// { dg-additional-options "-fvect-cost-model=cheap" } +// { dg-additional-options "-mavx2" { target x86_64-*-* i?86-*-* } } + +#include +#include + +inline uint32_t make_uint32(uint8_t i0, uint8_t i1, uint8_t i2, uint8_t i3) +{ + return ((static_cast(i0) << 24) | + (static_cast(i1) << 16) | + (static_cast(i2) << 8) | + (static_cast(i3))); +} + +inline uint32_t load_be(const uint8_t in[], size_t off) +{ + in += off * sizeof(uint32_t); + return make_uint32(in[0], in[1], in[2], in[3]); +} + +template +inline void load_be(const uint8_t in[], + T& x0, T& x1, T& x2, T& x3, + T& x4, T& x5, T& x6, T& x7) +{ + x0 = load_be(in, 0); + x1 = load_be(in, 1); + x2 = load_be(in, 2); + x3 = load_be(in, 3); + x4 = load_be(in, 4); + x5 = load_be(in, 5); + x6 = load_be(in, 6); + x7 = load_be(in, 7); +} + +inline void store_be(uint32_t in, uint8_t out[4]) +{ + uint32_t o = __builtin_bswap32 (in); + __builtin_memcpy (out, &o, sizeof (uint32_t)); +} + +template +inline void store_be(uint8_t out[], T x0, T x1, T x2, T x3, + T x4, T x5, T x6, T x7) +{ + store_be(x0, out + (0 * sizeof(T))); + store_be(x1, out + (1 * sizeof(T))); + store_be(x2, out + (2 * sizeof(T))); + store_be(x3, out + (3 * sizeof(T))); + store_be(x4, out + (4 * sizeof(T))); + store_be(x5, out + (5 * sizeof(T))); + store_be(x6, out + (6 * sizeof(T))); + store_be(x7, out + (7 * sizeof(T))); +} + +#define BLOCK_SIZE 8 +void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks, uint32_t *EK) +{ + const size_t blocks4 = blocks / 4; + + for (size_t i = 0; i < blocks4; i++) + { + uint32_t L0, R0, L1, R1, L2, R2, L3, R3; + load_be(in + 4*BLOCK_SIZE*i, L0, R0, L1, R1, L2, R2, L3, R3); + + for(size_t r = 0; r != 32; ++r) + { + L0 += (((R0 << 4) ^ (R0 >> 5)) + R0) ^ EK[2*r]; + L1 += (((R1 << 4) ^ (R1 >> 5)) + R1) ^ EK[2*r]; + L2 += (((R2 << 4) ^ (R2 >> 5)) + R2) ^ EK[2*r]; + L3 += (((R3 << 4) ^ (R3 >> 5)) + R3) ^ EK[2*r]; + + R0 += (((L0 << 4) ^ (L0 >> 5)) + L0) ^ EK[2*r+1]; + R1 += (((L1 << 4) ^ (L1 >> 5)) + L1) ^ EK[2*r+1]; + R2 += (((L2 << 4) ^ (L2 >> 5)) + L2) ^ EK[2*r+1]; + R3 += (((L3 << 4) ^ (L3 >> 5)) + L3) ^ EK[2*r+1]; + } + + store_be(out + 4*BLOCK_SIZE*i, L0, R0, L1, R1, L2, R2, L3, R3); + } +} + +// { dg-final { scan-tree-dump-times "not vectorized: vectorization is not profitable" 2 "slp1" { target x86_64-*-* i?86-*-* } } } diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c index 2305bbd..b9f12c3 100644 --- a/gcc/tree-vect-slp.c +++ b/gcc/tree-vect-slp.c @@ -4340,6 +4340,20 @@ vect_bb_slp_scalar_cost (vec_info *vinfo, } } +/* Comparator for the loop-index sorted cost vectors. */ + +static int +li_cost_vec_cmp (const void *a_, const void *b_) +{ + auto *a = (const std::pair *)a_; + auto *b = (const std::pair *)b_; + if (a->first < b->first) + return -1; + else if (a->first == b->first) + return 0; + return 1; +} + /* Check if vectorization of the basic block is profitable for the subgraph denoted by SLP_INSTANCES. */ @@ -4352,61 +4366,152 @@ vect_bb_vectorization_profitable_p (bb_vec_info bb_vinfo, unsigned int vec_inside_cost = 0, vec_outside_cost = 0, scalar_cost = 0; unsigned int vec_prologue_cost = 0, vec_epilogue_cost = 0; - void *vect_target_cost_data = init_cost (NULL); - /* Calculate scalar cost and sum the cost for the vector stmts previously collected. */ - stmt_vector_for_cost scalar_costs; - scalar_costs.create (0); + stmt_vector_for_cost scalar_costs = vNULL; + stmt_vector_for_cost vector_costs = vNULL; hash_set visited; FOR_EACH_VEC_ELT (slp_instances, i, instance) { auto_vec life; life.safe_grow_cleared (SLP_TREE_LANES (SLP_INSTANCE_TREE (instance)), true); + if (SLP_INSTANCE_ROOT_STMT (instance)) + record_stmt_cost (&scalar_costs, 1, scalar_stmt, + SLP_INSTANCE_ROOT_STMT (instance), 0, vect_body); vect_bb_slp_scalar_cost (bb_vinfo, SLP_INSTANCE_TREE (instance), &life, &scalar_costs, visited); - add_stmt_costs (bb_vinfo, vect_target_cost_data, &instance->cost_vec); + vector_costs.safe_splice (instance->cost_vec); instance->cost_vec.release (); } /* Unset visited flag. */ - stmt_info_for_cost *si; - FOR_EACH_VEC_ELT (scalar_costs, i, si) - gimple_set_visited (si->stmt_info->stmt, false); + stmt_info_for_cost *cost; + FOR_EACH_VEC_ELT (scalar_costs, i, cost) + gimple_set_visited (cost->stmt_info->stmt, false); - void *scalar_target_cost_data = init_cost (NULL); - add_stmt_costs (bb_vinfo, scalar_target_cost_data, &scalar_costs); - scalar_costs.release (); - unsigned dummy; - finish_cost (scalar_target_cost_data, &dummy, &scalar_cost, &dummy); - destroy_cost_data (scalar_target_cost_data); + if (dump_enabled_p ()) + dump_printf_loc (MSG_NOTE, vect_location, "Cost model analysis: \n"); + + /* When costing non-loop vectorization we need to consider each covered + loop independently and make sure vectorization is profitable. For + now we assume a loop may be not entered or executed an arbitrary + number of iterations (??? static information can provide more + precise info here) which means we can simply cost each containing + loops stmts separately. */ + + /* First produce cost vectors sorted by loop index. */ + auto_vec > + li_scalar_costs (scalar_costs.length ()); + auto_vec > + li_vector_costs (vector_costs.length ()); + FOR_EACH_VEC_ELT (scalar_costs, i, cost) + { + unsigned l = gimple_bb (cost->stmt_info->stmt)->loop_father->num; + li_scalar_costs.quick_push (std::make_pair (l, cost)); + } + /* Use a random used loop as fallback in case the first vector_costs + entry does not have a stmt_info associated with it. */ + unsigned l = li_scalar_costs[0].first; + FOR_EACH_VEC_ELT (vector_costs, i, cost) + { + /* We inherit from the previous COST, invariants, externals and + extracts immediately follow the cost for the related stmt. */ + if (cost->stmt_info) + l = gimple_bb (cost->stmt_info->stmt)->loop_father->num; + li_vector_costs.quick_push (std::make_pair (l, cost)); + } + li_scalar_costs.qsort (li_cost_vec_cmp); + li_vector_costs.qsort (li_cost_vec_cmp); + + /* Now cost the portions individually. */ + unsigned vi = 0; + unsigned si = 0; + do + { + unsigned sl = li_scalar_costs[si].first; + unsigned vl = li_vector_costs[vi].first; + if (sl != vl) + { + if (dump_enabled_p ()) + dump_printf_loc (MSG_NOTE, vect_location, + "Scalar %d and vector %d loop part do not " + "match up, skipping scalar part\n", sl, vl); + /* Skip the scalar part, assuming zero cost on the vector side. */ + do + { + si++; + } + while (si < li_scalar_costs.length () + && li_scalar_costs[si].first == sl); + continue; + } - /* Complete the target-specific vector cost calculation. */ - finish_cost (vect_target_cost_data, &vec_prologue_cost, - &vec_inside_cost, &vec_epilogue_cost); - destroy_cost_data (vect_target_cost_data); + void *scalar_target_cost_data = init_cost (NULL); + do + { + add_stmt_cost (bb_vinfo, scalar_target_cost_data, + li_scalar_costs[si].second); + si++; + } + while (si < li_scalar_costs.length () + && li_scalar_costs[si].first == sl); + unsigned dummy; + finish_cost (scalar_target_cost_data, &dummy, &scalar_cost, &dummy); + destroy_cost_data (scalar_target_cost_data); + + /* Complete the target-specific vector cost calculation. */ + void *vect_target_cost_data = init_cost (NULL); + do + { + add_stmt_cost (bb_vinfo, vect_target_cost_data, + li_vector_costs[vi].second); + vi++; + } + while (vi < li_vector_costs.length () + && li_vector_costs[vi].first == vl); + finish_cost (vect_target_cost_data, &vec_prologue_cost, + &vec_inside_cost, &vec_epilogue_cost); + destroy_cost_data (vect_target_cost_data); - vec_outside_cost = vec_prologue_cost + vec_epilogue_cost; + vec_outside_cost = vec_prologue_cost + vec_epilogue_cost; - if (dump_enabled_p ()) + if (dump_enabled_p ()) + { + dump_printf_loc (MSG_NOTE, vect_location, + "Cost model analysis for part in loop %d:\n", sl); + dump_printf (MSG_NOTE, " Vector cost: %d\n", + vec_inside_cost + vec_outside_cost); + dump_printf (MSG_NOTE, " Scalar cost: %d\n", scalar_cost); + } + + /* Vectorization is profitable if its cost is more than the cost of scalar + version. Note that we err on the vector side for equal cost because + the cost estimate is otherwise quite pessimistic (constant uses are + free on the scalar side but cost a load on the vector side for + example). */ + if (vec_outside_cost + vec_inside_cost > scalar_cost) + { + scalar_costs.release (); + vector_costs.release (); + return false; + } + } + while (si < li_scalar_costs.length () + && vi < li_vector_costs.length ()); + if (vi < li_vector_costs.length ()) { - dump_printf_loc (MSG_NOTE, vect_location, "Cost model analysis: \n"); - dump_printf (MSG_NOTE, " Vector inside of basic block cost: %d\n", - vec_inside_cost); - dump_printf (MSG_NOTE, " Vector prologue cost: %d\n", vec_prologue_cost); - dump_printf (MSG_NOTE, " Vector epilogue cost: %d\n", vec_epilogue_cost); - dump_printf (MSG_NOTE, " Scalar cost of basic block: %d\n", scalar_cost); + if (dump_enabled_p ()) + dump_printf_loc (MSG_NOTE, vect_location, + "Excess vector cost for part in loop %d:\n", + li_vector_costs[vi].first); + scalar_costs.release (); + vector_costs.release (); + return false; } - /* Vectorization is profitable if its cost is more than the cost of scalar - version. Note that we err on the vector side for equal cost because - the cost estimate is otherwise quite pessimistic (constant uses are - free on the scalar side but cost a load on the vector side for - example). */ - if (vec_outside_cost + vec_inside_cost > scalar_cost) - return false; - + scalar_costs.release (); + vector_costs.release (); return true; } diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h index e564fcf..b861c97 100644 --- a/gcc/tree-vectorizer.h +++ b/gcc/tree-vectorizer.h @@ -1481,6 +1481,15 @@ add_stmt_cost (vec_info *vinfo, void *data, int count, return cost; } +/* Alias targetm.vectorize.add_stmt_cost. */ + +static inline unsigned +add_stmt_cost (vec_info *vinfo, void *data, stmt_info_for_cost *i) +{ + return add_stmt_cost (vinfo, data, i->count, i->kind, i->stmt_info, + i->vectype, i->misalign, i->where); +} + /* Alias targetm.vectorize.finish_cost. */ static inline void -- cgit v1.1 From 6606b852bfa866c19375a7c5e9cb94776a28bd94 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Thu, 4 Feb 2021 08:16:17 -0800 Subject: driver: error for nonexistent linker inputs [PR 98943] We used to check all unknown input files, even when passing them to a compiler. But that caused problems. However, not erroring out on non-existent would-be-linker inputs confuses configure machinery that probes the compiler to see if it accepts various inputs. This restores the access check for things that are thought to be linker input files, when we're not linking. (If we are linking, we presume the linker will error out on its own accord.) PR driver/98943 gcc/ * gcc.c (driver::maybe_run_linker): Check for input file accessibility if not linking. gcc/testsuite/ * c-c++-common/pr98943.c: New. --- gcc/gcc.c | 11 +++++++++-- gcc/testsuite/c-c++-common/pr98943.c | 10 ++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/pr98943.c (limited to 'gcc') diff --git a/gcc/gcc.c b/gcc/gcc.c index 76f1d42..7837553 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -9020,8 +9020,15 @@ driver::maybe_run_linker (const char *argv0) const for (i = 0; (int) i < n_infiles; i++) if (explicit_link_files[i] && !(infiles[i].language && infiles[i].language[0] == '*')) - warning (0, "%s: linker input file unused because linking not done", - outfiles[i]); + { + warning (0, "%s: linker input file unused because linking not done", + outfiles[i]); + if (access (outfiles[i], F_OK) < 0) + /* This is can be an indication the user specifed an errorneous + separated option value, (or used the wrong prefix for an + option). */ + error ("%s: linker input file not found: %m", outfiles[i]); + } } /* The end of "main". */ diff --git a/gcc/testsuite/c-c++-common/pr98943.c b/gcc/testsuite/c-c++-common/pr98943.c new file mode 100644 index 0000000..53d8838 --- /dev/null +++ b/gcc/testsuite/c-c++-common/pr98943.c @@ -0,0 +1,10 @@ +// { dg-do compile } +// PR 98943, compiler feature tests can get confused by not linking +// { dg-options "NOTAFILE" } + +int main () +{ + return 0; +} + +// { dg-regexp {[^\n:]*: warning: NOTAFILE: linker input file unused because linking not done\n[^\n:]*: error: NOTAFILE: linker input file not found: [^\n]*\n} } -- cgit v1.1 From 1cbc10d894494c34987d1f42f955e7843457ee38 Mon Sep 17 00:00:00 2001 From: Marek Polacek Date: Thu, 4 Feb 2021 12:53:59 -0500 Subject: c++: Fix ICE with invalid using enum [PR96462] Here we ICE in finish_nonmember_using_decl -> lookup_using_decl -> ... -> find_namespace_slot because "name" is not an IDENTIFIER_NODE. It is a BIT_NOT_EXPR because this broken test uses using E::~E; // SCOPE::NAME A using-decl can't refer to a destructor, and lookup_using_decl already checks that in the class member case. But in C++17, we do the "enum scope is the enclosing scope" block, and so scope gets set to ::, and we go into the NAMESPACE_DECL block. In C++20 we don't do it, we go to the ENUMERAL_TYPE block. I resorted to hoisting the check along with a diagnostic tweak: we don't want to print "::::~E names destructor". gcc/cp/ChangeLog: PR c++/96462 * name-lookup.c (lookup_using_decl): Hoist the destructor check. gcc/testsuite/ChangeLog: PR c++/96462 * g++.dg/cpp2a/using-enum-8.C: New test. --- gcc/cp/name-lookup.c | 15 ++++++++------- gcc/testsuite/g++.dg/cpp2a/using-enum-8.C | 5 +++++ 2 files changed, 13 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp2a/using-enum-8.C (limited to 'gcc') diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index 52e4a63..1f4a7ac 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -5700,6 +5700,14 @@ lookup_using_decl (tree scope, name_lookup &lookup) scope = ctx; } + /* You cannot using-decl a destructor. */ + if (TREE_CODE (lookup.name) == BIT_NOT_EXPR) + { + error ("%<%T%s%D%> names destructor", scope, + &"::"[scope == global_namespace ? 2 : 0], lookup.name); + return NULL_TREE; + } + if (TREE_CODE (scope) == NAMESPACE_DECL) { /* Naming a namespace member. */ @@ -5739,13 +5747,6 @@ lookup_using_decl (tree scope, name_lookup &lookup) return NULL_TREE; } - /* You cannot using-decl a destructor. */ - if (TREE_CODE (lookup.name) == BIT_NOT_EXPR) - { - error ("%<%T::%D%> names destructor", scope, lookup.name); - return NULL_TREE; - } - /* Using T::T declares inheriting ctors, even if T is a typedef. */ if (lookup.name == TYPE_IDENTIFIER (npscope) || constructor_name_p (lookup.name, npscope)) diff --git a/gcc/testsuite/g++.dg/cpp2a/using-enum-8.C b/gcc/testsuite/g++.dg/cpp2a/using-enum-8.C new file mode 100644 index 0000000..9a743a9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/using-enum-8.C @@ -0,0 +1,5 @@ +// PR c++/96462 +// { dg-do compile { target c++11 } } + +enum E {}; +using E::~E; // { dg-error "names destructor" } -- cgit v1.1 From 7a18bc4ae62081021f4fd90d591a588cac931f77 Mon Sep 17 00:00:00 2001 From: Marek Polacek Date: Wed, 3 Feb 2021 17:57:22 -0500 Subject: c++: Fix bogus -Wvolatile warning in C++20 [PR98947] Since most of volatile is deprecated in C++20, we are required to warn for compound assignments to volatile variables and so on. But here we have volatile int x, y, z; (b ? x : y) = 1; and we shouldn't warn, because simple assignments like x = 24; should not provoke the warning when they are a discarded-value expression. We warn here because when ?: is used as an lvalue, we transform it in cp_build_modify_expr/COND_EXPR from (a ? b : c) = rhs to (a ? (b = rhs) : (c = rhs)) and build_conditional_expr then calls mark_lvalue_use for the new artificial assignments, which then evokes the warning. The calls to mark_lvalue_use were added in r160289 to suppress warnings in Wunused-var-10.c, but looks like they're no longer needed. To warn on (b ? (x = 2) : y) = 1; (b ? x : (y = 5)) = 1; I've tweaked a check in mark_use/MODIFY_EXPR. I'd argue this is a regression because GCC 9 doesn't warn. gcc/cp/ChangeLog: PR c++/98947 * call.c (build_conditional_expr_1): Don't call mark_lvalue_use on arg2/arg3. * expr.c (mark_use) : Don't check read_p when issuing the -Wvolatile warning. Only set TREE_THIS_VOLATILE if a warning was emitted. gcc/testsuite/ChangeLog: PR c++/98947 * g++.dg/cpp2a/volatile5.C: New test. --- gcc/cp/call.c | 2 -- gcc/cp/expr.c | 14 +++++++------- gcc/testsuite/g++.dg/cpp2a/volatile5.C | 15 +++++++++++++++ 3 files changed, 22 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp2a/volatile5.C (limited to 'gcc') diff --git a/gcc/cp/call.c b/gcc/cp/call.c index c7e13f3..4744c97 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -5559,8 +5559,6 @@ build_conditional_expr_1 (const op_location_t &loc, && same_type_p (arg2_type, arg3_type)) { result_type = arg2_type; - arg2 = mark_lvalue_use (arg2); - arg3 = mark_lvalue_use (arg3); goto valid_operands; } diff --git a/gcc/cp/expr.c b/gcc/cp/expr.c index 480e740..d16d189 100644 --- a/gcc/cp/expr.c +++ b/gcc/cp/expr.c @@ -224,17 +224,17 @@ mark_use (tree expr, bool rvalue_p, bool read_p, a volatile-qualified type is deprecated unless the assignment is either a discarded-value expression or appears in an unevaluated context." */ - if (read_p - && !cp_unevaluated_operand + if (!cp_unevaluated_operand && (TREE_THIS_VOLATILE (lhs) || CP_TYPE_VOLATILE_P (TREE_TYPE (lhs))) && !TREE_THIS_VOLATILE (expr)) { - warning_at (location_of (expr), OPT_Wvolatile, - "using value of simple assignment with %-" - "qualified left operand is deprecated"); - /* Make sure not to warn about this assignment again. */ - TREE_THIS_VOLATILE (expr) = true; + if (warning_at (location_of (expr), OPT_Wvolatile, + "using value of simple assignment with " + "%-qualified left operand is " + "deprecated")) + /* Make sure not to warn about this assignment again. */ + TREE_THIS_VOLATILE (expr) = true; } break; } diff --git a/gcc/testsuite/g++.dg/cpp2a/volatile5.C b/gcc/testsuite/g++.dg/cpp2a/volatile5.C new file mode 100644 index 0000000..1f9d238 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/volatile5.C @@ -0,0 +1,15 @@ +// PR c++/98947 +// { dg-do compile } + +volatile int x, y, z; + +void +f (bool b) +{ + (b ? x : y) = 1; + (b ? x : y) += 1; // { dg-warning "compound assignment" "" { target c++20 } } + z = (b ? x : y) = 1; // { dg-warning "using value of simple assignment" "" { target c++20 } } + ((z = 2) ? x : y) = 1; // { dg-warning "using value of simple assignment" "" { target c++20 } } + (b ? (x = 2) : y) = 1; // { dg-warning "using value of simple assignment" "" { target c++20 } } + (b ? x : (y = 5)) = 1; // { dg-warning "using value of simple assignment" "" { target c++20 } } +} -- cgit v1.1 From 28c7a463e3c38dde206cd077383cd90b6c3b7d2c Mon Sep 17 00:00:00 2001 From: Iain Buclaw Date: Fri, 5 Feb 2021 12:47:23 +0100 Subject: d: Remove the expansion of intrinsic and built-in codes from the DEF_D_INTRINSIC macro Instead, the full name of these codes are explicitly given in intrinsics.def, to make it clear what these values map to. gcc/d/ChangeLog: * d-tree.h (DEF_D_INTRINSIC): Don't insert INTRINSIC_ into the intrinsic code name. * intrinsics.cc (DEF_D_INTRINSIC): Don't insert INTRISIC_ and BUILT_IN_ into the intrinsic and built-in code names. * intrinsics.def: Explicitly use full intrinsic and built-in codes in all definitions. --- gcc/d/d-tree.h | 2 +- gcc/d/intrinsics.cc | 2 +- gcc/d/intrinsics.def | 298 +++++++++++++++++++++++++++++++++------------------ 3 files changed, 195 insertions(+), 107 deletions(-) (limited to 'gcc') diff --git a/gcc/d/d-tree.h b/gcc/d/d-tree.h index c41969e..724a0bf 100644 --- a/gcc/d/d-tree.h +++ b/gcc/d/d-tree.h @@ -80,7 +80,7 @@ enum level_kind enum intrinsic_code { -#define DEF_D_INTRINSIC(CODE, B, N, M, D, C) INTRINSIC_ ## CODE, +#define DEF_D_INTRINSIC(CODE, B, N, M, D, C) CODE, #include "intrinsics.def" diff --git a/gcc/d/intrinsics.cc b/gcc/d/intrinsics.cc index 7f97c1d..539dc0c 100644 --- a/gcc/d/intrinsics.cc +++ b/gcc/d/intrinsics.cc @@ -62,7 +62,7 @@ struct intrinsic_decl static const intrinsic_decl intrinsic_decls[] = { #define DEF_D_INTRINSIC(CODE, BUILTIN, NAME, MODULE, DECO, CTFE) \ - { INTRINSIC_ ## CODE, BUILT_IN_ ## BUILTIN, NAME, MODULE, DECO, CTFE }, + { CODE, BUILTIN, NAME, MODULE, DECO, CTFE }, #include "intrinsics.def" diff --git a/gcc/d/intrinsics.def b/gcc/d/intrinsics.def index dc6b104..f5af2a5 100644 --- a/gcc/d/intrinsics.def +++ b/gcc/d/intrinsics.def @@ -36,133 +36,221 @@ along with GCC; see the file COPYING3. If not see #define DEF_CTFE_BUILTIN(C, B, N, M, D) \ DEF_D_INTRINSIC (C, B, N, M, D, true) -DEF_D_BUILTIN (NONE, NONE, 0, 0, 0) +DEF_D_BUILTIN (INTRINSIC_NONE, BUILT_IN_NONE, 0, 0, 0) /* core.bitop intrinsics. */ -DEF_D_BUILTIN (BSF, NONE, "bsf", "core.bitop", "FNaNbNiNfkZi") -DEF_D_BUILTIN (BSR, NONE, "bsr", "core.bitop", "FNaNbNiNfkZi") -DEF_D_BUILTIN (BT, NONE, "bt", "core.bitop", "FNaNbNiMxPkkZi") -DEF_D_BUILTIN (BTC, NONE, "btc", "core.bitop", "FNaNbNiPkkZi") -DEF_D_BUILTIN (BTR, NONE, "btr", "core.bitop", "FNaNbNiPkkZi") -DEF_D_BUILTIN (BTS, NONE, "bts", "core.bitop", "FNaNbNiPkkZi") -DEF_D_BUILTIN (BSF64, NONE, "bsf", "core.bitop", "FNaNbNiNfmZi") -DEF_D_BUILTIN (BSR64, NONE, "bsr", "core.bitop", "FNaNbNiNfmZi") -DEF_D_BUILTIN (BT64, NONE, "bt", "core.bitop", "FNaNbNiMxPmmZi") -DEF_D_BUILTIN (BTC64, NONE, "btc", "core.bitop", "FNaNbNiPmmZi") -DEF_D_BUILTIN (BTR64, NONE, "btr", "core.bitop", "FNaNbNiPmmZi") -DEF_D_BUILTIN (BTS64, NONE, "bts", "core.bitop", "FNaNbNiPmmZi") - -DEF_D_BUILTIN (BSWAP16, BSWAP16, "byteswap", "core.bitop", "FNaNbNiNftZt") -DEF_D_BUILTIN (BSWAP32, BSWAP32, "bswap", "core.bitop", "FNaNbNiNfkZk") -DEF_D_BUILTIN (BSWAP64, BSWAP64, "bswap", "core.bitop", "FNaNbNiNfmZm") - -DEF_D_BUILTIN (POPCNT32, NONE, "popcnt", "core.bitop", "FNaNbNiNfkZi") -DEF_D_BUILTIN (POPCNT64, NONE, "popcnt", "core.bitop", "FNaNbNiNfmZi") - -DEF_D_BUILTIN (ROL, NONE, "rol", "core.bitop", "FNaI1TkZI1T") -DEF_D_BUILTIN (ROL_TIARG, NONE, "rol", "core.bitop", "FNaI1TZI1T") -DEF_D_BUILTIN (ROR, NONE, "ror", "core.bitop", "FNaI1TkZI1T") -DEF_D_BUILTIN (ROR_TIARG, NONE, "ror", "core.bitop", "FNaI1TZI1T") +DEF_D_BUILTIN (INTRINSIC_BSF, BUILT_IN_NONE, "bsf", "core.bitop", + "FNaNbNiNfkZi") +DEF_D_BUILTIN (INTRINSIC_BSR, BUILT_IN_NONE, "bsr", "core.bitop", + "FNaNbNiNfkZi") +DEF_D_BUILTIN (INTRINSIC_BT, BUILT_IN_NONE, "bt", "core.bitop", + "FNaNbNiMxPkkZi") +DEF_D_BUILTIN (INTRINSIC_BTC, BUILT_IN_NONE, "btc", "core.bitop", + "FNaNbNiPkkZi") +DEF_D_BUILTIN (INTRINSIC_BTR, BUILT_IN_NONE, "btr", "core.bitop", + "FNaNbNiPkkZi") +DEF_D_BUILTIN (INTRINSIC_BTS, BUILT_IN_NONE, "bts", "core.bitop", + "FNaNbNiPkkZi") +DEF_D_BUILTIN (INTRINSIC_BSF64, BUILT_IN_NONE, "bsf", "core.bitop", + "FNaNbNiNfmZi") +DEF_D_BUILTIN (INTRINSIC_BSR64, BUILT_IN_NONE, "bsr", "core.bitop", + "FNaNbNiNfmZi") +DEF_D_BUILTIN (INTRINSIC_BT64, BUILT_IN_NONE, "bt", "core.bitop", + "FNaNbNiMxPmmZi") +DEF_D_BUILTIN (INTRINSIC_BTC64, BUILT_IN_NONE, "btc", "core.bitop", + "FNaNbNiPmmZi") +DEF_D_BUILTIN (INTRINSIC_BTR64, BUILT_IN_NONE, "btr", "core.bitop", + "FNaNbNiPmmZi") +DEF_D_BUILTIN (INTRINSIC_BTS64, BUILT_IN_NONE, "bts", "core.bitop", + "FNaNbNiPmmZi") + +DEF_D_BUILTIN (INTRINSIC_BSWAP16, BUILT_IN_BSWAP16, "byteswap", "core.bitop", + "FNaNbNiNftZt") +DEF_D_BUILTIN (INTRINSIC_BSWAP32, BUILT_IN_BSWAP32, "bswap", "core.bitop", + "FNaNbNiNfkZk") +DEF_D_BUILTIN (INTRINSIC_BSWAP64, BUILT_IN_BSWAP64, "bswap", "core.bitop", + "FNaNbNiNfmZm") + +DEF_D_BUILTIN (INTRINSIC_POPCNT32, BUILT_IN_NONE, "popcnt", "core.bitop", + "FNaNbNiNfkZi") +DEF_D_BUILTIN (INTRINSIC_POPCNT64, BUILT_IN_NONE, "popcnt", "core.bitop", + "FNaNbNiNfmZi") + +DEF_D_BUILTIN (INTRINSIC_ROL, BUILT_IN_NONE, "rol", "core.bitop", "FNaI1TkZI1T") +DEF_D_BUILTIN (INTRINSIC_ROL_TIARG, BUILT_IN_NONE, "rol", "core.bitop", + "FNaI1TZI1T") +DEF_D_BUILTIN (INTRINSIC_ROR, BUILT_IN_NONE, "ror", "core.bitop", "FNaI1TkZI1T") +DEF_D_BUILTIN (INTRINSIC_ROR_TIARG, BUILT_IN_NONE, "ror", "core.bitop", + "FNaI1TZI1T") /* core.volatile intrinsics. */ -DEF_D_BUILTIN (VLOAD8, NONE, "volatileLoad", "core.volatile", "FNbNiNfPhZh") -DEF_D_BUILTIN (VLOAD16, NONE, "volatileLoad", "core.volatile", "FNbNiNfPtZt") -DEF_D_BUILTIN (VLOAD32, NONE, "volatileLoad", "core.volatile", "FNbNiNfPkZk") -DEF_D_BUILTIN (VLOAD64, NONE, "volatileLoad", "core.volatile", "FNbNiNfPmZm") -DEF_D_BUILTIN (VSTORE8, NONE, "volatileStore", "core.volatile", "FNbNiNfPhhZv") -DEF_D_BUILTIN (VSTORE16, NONE, "volatileStore", "core.volatile", "FNbNiNfPttZv") -DEF_D_BUILTIN (VSTORE32, NONE, "volatileStore", "core.volatile", "FNbNiNfPkkZv") -DEF_D_BUILTIN (VSTORE64, NONE, "volatileStore", "core.volatile", "FNbNiNfPmmZv") +DEF_D_BUILTIN (INTRINSIC_VLOAD8, BUILT_IN_NONE, "volatileLoad", "core.volatile", + "FNbNiNfPhZh") +DEF_D_BUILTIN (INTRINSIC_VLOAD16, BUILT_IN_NONE, "volatileLoad", + "core.volatile", "FNbNiNfPtZt") +DEF_D_BUILTIN (INTRINSIC_VLOAD32, BUILT_IN_NONE, "volatileLoad", + "core.volatile", "FNbNiNfPkZk") +DEF_D_BUILTIN (INTRINSIC_VLOAD64, BUILT_IN_NONE, "volatileLoad", + "core.volatile", "FNbNiNfPmZm") +DEF_D_BUILTIN (INTRINSIC_VSTORE8, BUILT_IN_NONE, "volatileStore", + "core.volatile", "FNbNiNfPhhZv") +DEF_D_BUILTIN (INTRINSIC_VSTORE16, BUILT_IN_NONE, "volatileStore", + "core.volatile", "FNbNiNfPttZv") +DEF_D_BUILTIN (INTRINSIC_VSTORE32, BUILT_IN_NONE, "volatileStore", + "core.volatile", "FNbNiNfPkkZv") +DEF_D_BUILTIN (INTRINSIC_VSTORE64, BUILT_IN_NONE, "volatileStore", + "core.volatile", "FNbNiNfPmmZv") /* core.checkedint intrinsics. */ -DEF_D_BUILTIN (ADDS, NONE, "adds", "core.checkedint", "FiiKbZi") -DEF_D_BUILTIN (ADDSL, NONE, "adds", "core.checkedint", "FllKbZl") -DEF_D_BUILTIN (ADDU, NONE, "addu", "core.checkedint", "FkkKbZk") -DEF_D_BUILTIN (ADDUL, NONE, "addu", "core.checkedint", "FmmKbZm") -DEF_D_BUILTIN (SUBS, NONE, "subs", "core.checkedint", "FiiKbZi") -DEF_D_BUILTIN (SUBSL, NONE, "subs", "core.checkedint", "FllKbZl") -DEF_D_BUILTIN (SUBU, NONE, "subu", "core.checkedint", "FkkKbZk") -DEF_D_BUILTIN (SUBUL, NONE, "subu", "core.checkedint", "FmmKbZm") -DEF_D_BUILTIN (MULS, NONE, "muls", "core.checkedint", "FiiKbZi") -DEF_D_BUILTIN (MULSL, NONE, "muls", "core.checkedint", "FllKbZl") -DEF_D_BUILTIN (MULU, NONE, "mulu", "core.checkedint", "FkkKbZk") -DEF_D_BUILTIN (MULUI, NONE, "mulu", "core.checkedint", "FmkKbZm") -DEF_D_BUILTIN (MULUL, NONE, "mulu", "core.checkedint", "FmmKbZm") -DEF_D_BUILTIN (NEGS, NONE, "negs", "core.checkedint", "FiKbZi") -DEF_D_BUILTIN (NEGSL, NONE, "negs", "core.checkedint", "FlKbZl") +DEF_D_BUILTIN (INTRINSIC_ADDS, BUILT_IN_NONE, "adds", "core.checkedint", + "FiiKbZi") +DEF_D_BUILTIN (INTRINSIC_ADDSL, BUILT_IN_NONE, "adds", "core.checkedint", + "FllKbZl") +DEF_D_BUILTIN (INTRINSIC_ADDU, BUILT_IN_NONE, "addu", "core.checkedint", + "FkkKbZk") +DEF_D_BUILTIN (INTRINSIC_ADDUL, BUILT_IN_NONE, "addu", "core.checkedint", + "FmmKbZm") +DEF_D_BUILTIN (INTRINSIC_SUBS, BUILT_IN_NONE, "subs", "core.checkedint", + "FiiKbZi") +DEF_D_BUILTIN (INTRINSIC_SUBSL, BUILT_IN_NONE, "subs", "core.checkedint", + "FllKbZl") +DEF_D_BUILTIN (INTRINSIC_SUBU, BUILT_IN_NONE, "subu", "core.checkedint", + "FkkKbZk") +DEF_D_BUILTIN (INTRINSIC_SUBUL, BUILT_IN_NONE, "subu", "core.checkedint", + "FmmKbZm") +DEF_D_BUILTIN (INTRINSIC_MULS, BUILT_IN_NONE, "muls", "core.checkedint", + "FiiKbZi") +DEF_D_BUILTIN (INTRINSIC_MULSL, BUILT_IN_NONE, "muls", "core.checkedint", + "FllKbZl") +DEF_D_BUILTIN (INTRINSIC_MULU, BUILT_IN_NONE, "mulu", "core.checkedint", + "FkkKbZk") +DEF_D_BUILTIN (INTRINSIC_MULUI, BUILT_IN_NONE, "mulu", "core.checkedint", + "FmkKbZm") +DEF_D_BUILTIN (INTRINSIC_MULUL, BUILT_IN_NONE, "mulu", "core.checkedint", + "FmmKbZm") +DEF_D_BUILTIN (INTRINSIC_NEGS, BUILT_IN_NONE, "negs", "core.checkedint", + "FiKbZi") +DEF_D_BUILTIN (INTRINSIC_NEGSL, BUILT_IN_NONE, "negs", "core.checkedint", + "FlKbZl") /* core.math intrinsics. */ -DEF_D_BUILTIN (COSF, COSF, "cos", "core.math", "FNaNbNiNffZf") -DEF_D_BUILTIN (COS, COS, "cos", "core.math", "FNaNbNiNfdZd") -DEF_D_BUILTIN (COSL, COSL, "cos", "core.math", "FNaNbNiNfeZe") -DEF_D_BUILTIN (FABSF, FABSL, "fabs", "core.math", "FNaNbNiNffZf") -DEF_D_BUILTIN (FABS, FABS, "fabs", "core.math", "FNaNbNiNfdZd") -DEF_D_BUILTIN (FABSL, FABSL, "fabs", "core.math", "FNaNbNiNfeZe") -DEF_D_BUILTIN (LDEXPF, LDEXPF, "ldexp", "core.math", "FNaNbNiNffiZf") -DEF_D_BUILTIN (LDEXP, LDEXP, "ldexp", "core.math", "FNaNbNiNfdiZd") -DEF_D_BUILTIN (LDEXPL, LDEXPL, "ldexp", "core.math", "FNaNbNiNfeiZe") -DEF_D_BUILTIN (RINTF, RINTF, "rint", "core.math", "FNaNbNiNffZf") -DEF_D_BUILTIN (RINT, RINT, "rint", "core.math", "FNaNbNiNfdZd") -DEF_D_BUILTIN (RINTL, RINTL, "rint", "core.math", "FNaNbNiNfeZe") +DEF_D_BUILTIN (INTRINSIC_COSF, BUILT_IN_COSF, "cos", "core.math", + "FNaNbNiNffZf") +DEF_D_BUILTIN (INTRINSIC_COS, BUILT_IN_COS, "cos", "core.math", "FNaNbNiNfdZd") +DEF_D_BUILTIN (INTRINSIC_COSL, BUILT_IN_COSL, "cos", "core.math", + "FNaNbNiNfeZe") +DEF_D_BUILTIN (INTRINSIC_FABSF, BUILT_IN_FABSL, "fabs", "core.math", + "FNaNbNiNffZf") +DEF_D_BUILTIN (INTRINSIC_FABS, BUILT_IN_FABS, "fabs", "core.math", + "FNaNbNiNfdZd") +DEF_D_BUILTIN (INTRINSIC_FABSL, BUILT_IN_FABSL, "fabs", "core.math", + "FNaNbNiNfeZe") +DEF_D_BUILTIN (INTRINSIC_LDEXPF, BUILT_IN_LDEXPF, "ldexp", "core.math", + "FNaNbNiNffiZf") +DEF_D_BUILTIN (INTRINSIC_LDEXP, BUILT_IN_LDEXP, "ldexp", "core.math", + "FNaNbNiNfdiZd") +DEF_D_BUILTIN (INTRINSIC_LDEXPL, BUILT_IN_LDEXPL, "ldexp", "core.math", + "FNaNbNiNfeiZe") +DEF_D_BUILTIN (INTRINSIC_RINTF, BUILT_IN_RINTF, "rint", "core.math", + "FNaNbNiNffZf") +DEF_D_BUILTIN (INTRINSIC_RINT, BUILT_IN_RINT, "rint", "core.math", + "FNaNbNiNfdZd") +DEF_D_BUILTIN (INTRINSIC_RINTL, BUILT_IN_RINTL, "rint", "core.math", + "FNaNbNiNfeZe") /* Not sure if `llround{f,l}' stands as a good replacement for the expected - behavior of `rndtol()'. */ -DEF_D_BUILTIN (RNDTOLF, LLROUNDF, "rndtol", "core.math", "FNaNbNiNffZl") -DEF_D_BUILTIN (RNDTOL, LLROUND, "rndtol", "core.math", "FNaNbNiNfdZl") -DEF_D_BUILTIN (RNDTOLL, LLROUNDL, "rndtol", "core.math", "FNaNbNiNfeZl") - -DEF_D_BUILTIN (SINF, SINF, "sin", "core.math", "FNaNbNiNffZf") -DEF_D_BUILTIN (SIN, SIN, "sin", "core.math", "FNaNbNiNfdZd") -DEF_D_BUILTIN (SINL, SINL, "sin", "core.math", "FNaNbNiNfeZe") -DEF_D_BUILTIN (SQRTF, SQRTF, "sqrt", "core.math", "FNaNbNiNffZf") -DEF_D_BUILTIN (SQRT, SQRT, "sqrt", "core.math", "FNaNbNiNfdZd") -DEF_D_BUILTIN (SQRTL, SQRTL, "sqrt", "core.math", "FNaNbNiNfeZe") -DEF_D_BUILTIN (TOPRECF, NONE, "toPrec", "core.math", "FfZI1T") -DEF_D_BUILTIN (TOPREC, NONE, "toPrec", "core.math", "FdZI1T") -DEF_D_BUILTIN (TOPRECL, NONE, "toPrec", "core.math", "FeZI1T") + behavior of `rndtol(INTRINSIC_)'. */ +DEF_D_BUILTIN (INTRINSIC_RNDTOLF, BUILT_IN_LLROUNDF, "rndtol", "core.math", + "FNaNbNiNffZl") +DEF_D_BUILTIN (INTRINSIC_RNDTOL, BUILT_IN_LLROUND, "rndtol", "core.math", + "FNaNbNiNfdZl") +DEF_D_BUILTIN (INTRINSIC_RNDTOLL, BUILT_IN_LLROUNDL, "rndtol", "core.math", + "FNaNbNiNfeZl") + +DEF_D_BUILTIN (INTRINSIC_SINF, BUILT_IN_SINF, "sin", "core.math", + "FNaNbNiNffZf") +DEF_D_BUILTIN (INTRINSIC_SIN, BUILT_IN_SIN, "sin", "core.math", "FNaNbNiNfdZd") +DEF_D_BUILTIN (INTRINSIC_SINL, BUILT_IN_SINL, "sin", "core.math", + "FNaNbNiNfeZe") +DEF_D_BUILTIN (INTRINSIC_SQRTF, BUILT_IN_SQRTF, "sqrt", "core.math", + "FNaNbNiNffZf") +DEF_D_BUILTIN (INTRINSIC_SQRT, BUILT_IN_SQRT, "sqrt", "core.math", + "FNaNbNiNfdZd") +DEF_D_BUILTIN (INTRINSIC_SQRTL, BUILT_IN_SQRTL, "sqrt", "core.math", + "FNaNbNiNfeZe") +DEF_D_BUILTIN (INTRINSIC_TOPRECF, BUILT_IN_NONE, "toPrec", "core.math", + "FfZI1T") +DEF_D_BUILTIN (INTRINSIC_TOPREC, BUILT_IN_NONE, "toPrec", "core.math", "FdZI1T") +DEF_D_BUILTIN (INTRINSIC_TOPRECL, BUILT_IN_NONE, "toPrec", "core.math", + "FeZI1T") /* std.math intrinsics. */ -DEF_CTFE_BUILTIN (TAN, TANL, "tan", "std.math", "FNaNbNiNeeZe") -DEF_CTFE_BUILTIN (ISNAN, ISNAN, "isNaN", "std.math", "FNaNbNiNeI1XZb") -DEF_CTFE_BUILTIN (ISINFINITY, ISINF, "isInfinity", "std.math", "FNaNbNiNeI1XZb") -DEF_CTFE_BUILTIN (ISFINITE, ISFINITE, "isFinite", "std.math", "FNaNbNiNeI1XZb") - -DEF_CTFE_BUILTIN (EXP, EXPL, "exp", "std.math", "FNaNbNiNeeZe") -DEF_CTFE_BUILTIN (EXPM1, EXPM1L, "expm1", "std.math", "FNaNbNiNeeZe") -DEF_CTFE_BUILTIN (EXP2, EXP2L, "exp2", "std.math", "FNaNbNiNeeZe") - -DEF_CTFE_BUILTIN (LOG, LOGL, "log", "std.math", "FNaNbNiNfeZe") -DEF_CTFE_BUILTIN (LOG2, LOG2L, "log2", "std.math", "FNaNbNiNfeZe") -DEF_CTFE_BUILTIN (LOG10, LOG10L, "log10", "std.math", "FNaNbNiNfeZe") - -DEF_CTFE_BUILTIN (ROUND, ROUNDL, "round", "std.math", "FNbNiNeeZe") -DEF_CTFE_BUILTIN (FLOORF, FLOORF, "floor", "std.math", "FNaNbNiNefZf") -DEF_CTFE_BUILTIN (FLOOR, FLOOR, "floor", "std.math", "FNaNbNiNedZd") -DEF_CTFE_BUILTIN (FLOORL, FLOORL, "floor", "std.math", "FNaNbNiNeeZe") -DEF_CTFE_BUILTIN (CEILF, CEILF, "ceil", "std.math", "FNaNbNiNefZf") -DEF_CTFE_BUILTIN (CEIL, CEIL, "ceil", "std.math", "FNaNbNiNedZd") -DEF_CTFE_BUILTIN (CEILL, CEILL, "ceil", "std.math", "FNaNbNiNeeZe") - -DEF_CTFE_BUILTIN (TRUNC, TRUNCL, "trunc", "std.math", "FNbNiNeeZe") -DEF_CTFE_BUILTIN (FMIN, FMINL, "fmin", "std.math", "FNaNbNiNfeeZe") -DEF_CTFE_BUILTIN (FMAX, FMAXL, "fmax", "std.math", "FNaNbNiNfeeZe") -DEF_CTFE_BUILTIN (COPYSIGN, NONE, "copysign", "std.math", "FNaNbNiNeI1RI1XZI1R") -DEF_CTFE_BUILTIN (COPYSIGNI, NONE, "copysign", "std.math", +DEF_CTFE_BUILTIN (INTRINSIC_TAN, BUILT_IN_TANL, "tan", "std.math", + "FNaNbNiNeeZe") +DEF_CTFE_BUILTIN (INTRINSIC_ISNAN, BUILT_IN_ISNAN, "isNaN", "std.math", + "FNaNbNiNeI1XZb") +DEF_CTFE_BUILTIN (INTRINSIC_ISINFINITY, BUILT_IN_ISINF, "isInfinity", + "std.math", "FNaNbNiNeI1XZb") +DEF_CTFE_BUILTIN (INTRINSIC_ISFINITE, BUILT_IN_ISFINITE, "isFinite", "std.math", + "FNaNbNiNeI1XZb") + +DEF_CTFE_BUILTIN (INTRINSIC_EXP, BUILT_IN_EXPL, "exp", "std.math", + "FNaNbNiNeeZe") +DEF_CTFE_BUILTIN (INTRINSIC_EXPM1, BUILT_IN_EXPM1L, "expm1", "std.math", + "FNaNbNiNeeZe") +DEF_CTFE_BUILTIN (INTRINSIC_EXP2, BUILT_IN_EXP2L, "exp2", "std.math", + "FNaNbNiNeeZe") + +DEF_CTFE_BUILTIN (INTRINSIC_LOG, BUILT_IN_LOGL, "log", "std.math", + "FNaNbNiNfeZe") +DEF_CTFE_BUILTIN (INTRINSIC_LOG2, BUILT_IN_LOG2L, "log2", "std.math", + "FNaNbNiNfeZe") +DEF_CTFE_BUILTIN (INTRINSIC_LOG10, BUILT_IN_LOG10L, "log10", "std.math", + "FNaNbNiNfeZe") + +DEF_CTFE_BUILTIN (INTRINSIC_ROUND, BUILT_IN_ROUNDL, "round", "std.math", + "FNbNiNeeZe") +DEF_CTFE_BUILTIN (INTRINSIC_FLOORF, BUILT_IN_FLOORF, "floor", "std.math", + "FNaNbNiNefZf") +DEF_CTFE_BUILTIN (INTRINSIC_FLOOR, BUILT_IN_FLOOR, "floor", "std.math", + "FNaNbNiNedZd") +DEF_CTFE_BUILTIN (INTRINSIC_FLOORL, BUILT_IN_FLOORL, "floor", "std.math", + "FNaNbNiNeeZe") +DEF_CTFE_BUILTIN (INTRINSIC_CEILF, BUILT_IN_CEILF, "ceil", "std.math", + "FNaNbNiNefZf") +DEF_CTFE_BUILTIN (INTRINSIC_CEIL, BUILT_IN_CEIL, "ceil", "std.math", + "FNaNbNiNedZd") +DEF_CTFE_BUILTIN (INTRINSIC_CEILL, BUILT_IN_CEILL, "ceil", "std.math", + "FNaNbNiNeeZe") + +DEF_CTFE_BUILTIN (INTRINSIC_TRUNC, BUILT_IN_TRUNCL, "trunc", "std.math", + "FNbNiNeeZe") +DEF_CTFE_BUILTIN (INTRINSIC_FMIN, BUILT_IN_FMINL, "fmin", "std.math", + "FNaNbNiNfeeZe") +DEF_CTFE_BUILTIN (INTRINSIC_FMAX, BUILT_IN_FMAXL, "fmax", "std.math", + "FNaNbNiNfeeZe") +DEF_CTFE_BUILTIN (INTRINSIC_COPYSIGN, BUILT_IN_NONE, "copysign", "std.math", + "FNaNbNiNeI1RI1XZI1R") +DEF_CTFE_BUILTIN (INTRINSIC_COPYSIGNI, BUILT_IN_NONE, "copysign", "std.math", "FNaNbNiNeI1XI1RZI1R") -DEF_CTFE_BUILTIN (POW, NONE, "pow", "std.math", "FNaNbNiNeI1FI1GZ@") -DEF_CTFE_BUILTIN (FMA, FMAL, "fma", "std.math", "FNaNbNiNfeeeZe") +DEF_CTFE_BUILTIN (INTRINSIC_POW, BUILT_IN_NONE, "pow", "std.math", + "FNaNbNiNeI1FI1GZ@") +DEF_CTFE_BUILTIN (INTRINSIC_FMA, BUILT_IN_FMAL, "fma", "std.math", + "FNaNbNiNfeeeZe") /* core.stdc.stdarg intrinsics. */ -DEF_D_BUILTIN (VA_ARG, NONE, "va_arg", "core.stdc.stdarg", "FKI7va_listKI1TZv") -DEF_D_BUILTIN (C_VA_ARG, NONE, "va_arg", "core.stdc.stdarg", "FKI7va_listZI1T") -DEF_D_BUILTIN (VASTART, NONE, "va_start", "core.stdc.stdarg", +DEF_D_BUILTIN (INTRINSIC_VA_ARG, BUILT_IN_NONE, "va_arg", "core.stdc.stdarg", + "FKI7va_listKI1TZv") +DEF_D_BUILTIN (INTRINSIC_C_VA_ARG, BUILT_IN_NONE, "va_arg", "core.stdc.stdarg", + "FKI7va_listZI1T") +DEF_D_BUILTIN (INTRINSIC_VASTART, BUILT_IN_NONE, "va_start", "core.stdc.stdarg", "FJI7va_listKI1TZv") #undef DEF_D_BUILTIN -- cgit v1.1 From a1265ee47800550ac4c7c6b7d3924431ad545449 Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Fri, 5 Feb 2021 21:40:13 +0000 Subject: Regenerate .pot files. gcc/po/ * gcc.pot: Regenerate. libcpp/po/ * cpplib.pot: Regenerate. --- gcc/po/gcc.pot | 25417 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 13803 insertions(+), 11614 deletions(-) (limited to 'gcc') diff --git a/gcc/po/gcc.pot b/gcc/po/gcc.pot index 99c40e9..eb8757a 100644 --- a/gcc/po/gcc.pot +++ b/gcc/po/gcc.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: https://gcc.gnu.org/bugs/\n" -"POT-Creation-Date: 2020-07-20 18:03+0000\n" +"POT-Creation-Date: 2021-02-05 21:38+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -34,50 +34,50 @@ msgstr "" msgid "return not followed by barrier" msgstr "" -#: collect-utils.c:165 +#: collect-utils.c:169 #, c-format msgid "[cannot find %s]" msgstr "" -#: collect2.c:1569 +#: collect2.c:1587 #, c-format msgid "collect2 version %s\n" msgstr "" -#: collect2.c:1674 +#: collect2.c:1692 #, c-format msgid "%d constructor found\n" msgid_plural "%d constructors found\n" msgstr[0] "" msgstr[1] "" -#: collect2.c:1678 +#: collect2.c:1696 #, c-format msgid "%d destructor found\n" msgid_plural "%d destructors found\n" msgstr[0] "" msgstr[1] "" -#: collect2.c:1682 +#: collect2.c:1700 #, c-format msgid "%d frame table found\n" msgid_plural "%d frame tables found\n" msgstr[0] "" msgstr[1] "" -#: collect2.c:1837 +#: collect2.c:1855 #, c-format msgid "[Leaving %s]\n" msgstr "" -#: collect2.c:2067 +#: collect2.c:2085 #, c-format msgid "" "\n" "write_c_file - output name is %s, prefix is %s\n" msgstr "" -#: collect2.c:2572 +#: collect2.c:2608 #, c-format msgid "" "\n" @@ -98,94 +98,122 @@ msgstr "" msgid "%s: some warnings being treated as errors" msgstr "" -#: diagnostic.c:422 input.c:225 input.c:1874 c-family/c-opts.c:1428 -#: fortran/cpp.c:577 fortran/error.c:1049 fortran/error.c:1069 +#: diagnostic.c:440 input.c:225 input.c:1876 c-family/c-opts.c:1458 +#: fortran/cpp.c:579 fortran/error.c:1049 fortran/error.c:1069 msgid "" msgstr "" -#: diagnostic.c:579 +#: diagnostic.c:598 #, c-format msgid "compilation terminated due to -fmax-errors=%u.\n" msgstr "" -#: diagnostic.c:607 +#: diagnostic.c:626 #, c-format msgid "compilation terminated due to -Wfatal-errors.\n" msgstr "" -#: diagnostic.c:627 +#: diagnostic.c:646 #, c-format msgid "" "Please submit a full bug report,\n" "with preprocessed source if appropriate.\n" msgstr "" -#: diagnostic.c:633 +#: diagnostic.c:652 #, c-format msgid "See %s for instructions.\n" msgstr "" -#: diagnostic.c:642 +#: diagnostic.c:661 #, c-format msgid "compilation terminated.\n" msgstr "" -#: diagnostic.c:709 +#: diagnostic.c:730 +msgid " from" +msgstr "" + +#: diagnostic.c:731 msgid "In file included from" msgstr "" -#: diagnostic.c:710 -msgid " from" +#. 2 +#: diagnostic.c:732 +msgid " included from" msgstr "" -#: diagnostic.c:1181 +#: diagnostic.c:733 +msgid "In module" +msgstr "" + +#. 4 +#: diagnostic.c:734 +msgid "of module" +msgstr "" + +#: diagnostic.c:735 +msgid "In module imported at" +msgstr "" + +#. 6 +#: diagnostic.c:736 +msgid "imported at" +msgstr "" + +#: diagnostic.c:1220 #, c-format msgid "%s:%d: confused by earlier errors, bailing out\n" msgstr "" -#: diagnostic.c:1806 +#: diagnostic.c:1857 #, c-format msgid "Internal compiler error: Error reporting routines re-entered.\n" msgstr "" -#: final.c:1126 +#: diagnostic.c:1888 diagnostic.c:1907 +#, gcc-internal-format, gfc-internal-format +msgid "in %s, at %s:%d" +msgstr "" + +#: final.c:1127 msgid "negative insn length" msgstr "" -#: final.c:3073 +#: final.c:3092 msgid "could not split insn" msgstr "" -#: final.c:3602 +#: final.c:3620 msgid "invalid 'asm': " msgstr "" -#: final.c:3735 +#: final.c:3753 #, c-format msgid "nested assembly dialect alternatives" msgstr "" -#: final.c:3763 final.c:3775 +#: final.c:3781 final.c:3793 #, c-format msgid "unterminated assembly dialect alternative" msgstr "" -#: final.c:3917 +#: final.c:3935 #, c-format msgid "operand number missing after %%-letter" msgstr "" -#: final.c:3920 final.c:3961 +#: final.c:3938 final.c:3979 #, c-format msgid "operand number out of range" msgstr "" -#: final.c:3978 +#: final.c:3996 #, c-format msgid "invalid %%-code" msgstr "" -#: final.c:4012 +#: final.c:4030 #, c-format msgid "'%%l' operand isn't a label" msgstr "" @@ -194,12 +222,12 @@ msgstr "" #. PRINT_OPERAND must handle them. #. We can't handle floating point constants; #. TARGET_PRINT_OPERAND must handle them. -#: final.c:4148 config/arc/arc.c:6404 config/i386/i386.c:11644 +#: final.c:4166 config/arc/arc.c:6404 config/i386/i386.c:11956 #, c-format msgid "floating constant misused" msgstr "" -#: final.c:4206 config/arc/arc.c:6501 config/i386/i386.c:11735 +#: final.c:4224 config/arc/arc.c:6501 config/i386/i386.c:12047 #: config/pdp11/pdp11.c:1874 #, c-format msgid "invalid expression as operand" @@ -210,277 +238,277 @@ msgstr "" msgid "%s\n" msgstr "" -#: gcc.c:1763 +#: gcc.c:1841 #, c-format msgid "Using built-in specs.\n" msgstr "" -#: gcc.c:1963 +#: gcc.c:2086 #, c-format msgid "" "Setting spec %s to '%s'\n" "\n" msgstr "" -#: gcc.c:2142 +#: gcc.c:2291 #, c-format msgid "Reading specs from %s\n" msgstr "" -#: gcc.c:2274 +#: gcc.c:2423 #, c-format msgid "could not find specs file %s\n" msgstr "" -#: gcc.c:2349 +#: gcc.c:2498 #, c-format msgid "rename spec %s to %s\n" msgstr "" -#: gcc.c:2351 +#: gcc.c:2500 #, c-format msgid "" "spec is '%s'\n" "\n" msgstr "" -#: gcc.c:3198 +#: gcc.c:3347 #, c-format msgid "" "\n" "Go ahead? (y or n) " msgstr "" -#: gcc.c:3370 +#: gcc.c:3519 #, c-format msgid "# %s %.2f %.2f\n" msgstr "" -#: gcc.c:3586 +#: gcc.c:3735 #, c-format msgid "Usage: %s [options] file...\n" msgstr "" -#: gcc.c:3587 +#: gcc.c:3736 msgid "Options:\n" msgstr "" -#: gcc.c:3589 +#: gcc.c:3738 msgid " -pass-exit-codes Exit with highest error code from a phase.\n" msgstr "" -#: gcc.c:3590 +#: gcc.c:3739 msgid " --help Display this information.\n" msgstr "" -#: gcc.c:3591 +#: gcc.c:3740 msgid "" " --target-help Display target specific command line options.\n" msgstr "" -#: gcc.c:3592 +#: gcc.c:3741 msgid "" " --help={common|optimizers|params|target|warnings|[^]{joined|separate|" "undocumented}}[,...].\n" msgstr "" -#: gcc.c:3593 +#: gcc.c:3742 msgid "" " Display specific types of command line options.\n" msgstr "" -#: gcc.c:3595 +#: gcc.c:3744 msgid " (Use '-v --help' to display command line options of sub-processes).\n" msgstr "" -#: gcc.c:3596 +#: gcc.c:3745 msgid " --version Display compiler version information.\n" msgstr "" -#: gcc.c:3597 +#: gcc.c:3746 msgid " -dumpspecs Display all of the built in spec strings.\n" msgstr "" -#: gcc.c:3598 +#: gcc.c:3747 msgid " -dumpversion Display the version of the compiler.\n" msgstr "" -#: gcc.c:3599 +#: gcc.c:3748 msgid " -dumpmachine Display the compiler's target processor.\n" msgstr "" -#: gcc.c:3600 +#: gcc.c:3749 msgid "" " -print-search-dirs Display the directories in the compiler's search " "path.\n" msgstr "" -#: gcc.c:3601 +#: gcc.c:3750 msgid "" " -print-libgcc-file-name Display the name of the compiler's companion " "library.\n" msgstr "" -#: gcc.c:3602 +#: gcc.c:3751 msgid " -print-file-name= Display the full path to library .\n" msgstr "" -#: gcc.c:3603 +#: gcc.c:3752 msgid "" " -print-prog-name= Display the full path to compiler component " ".\n" msgstr "" -#: gcc.c:3604 +#: gcc.c:3753 msgid "" " -print-multiarch Display the target's normalized GNU triplet, used " "as\n" " a component in the library path.\n" msgstr "" -#: gcc.c:3607 +#: gcc.c:3756 msgid "" " -print-multi-directory Display the root directory for versions of " "libgcc.\n" msgstr "" -#: gcc.c:3608 +#: gcc.c:3757 msgid "" " -print-multi-lib Display the mapping between command line options " "and\n" " multiple library search directories.\n" msgstr "" -#: gcc.c:3611 +#: gcc.c:3760 msgid "" " -print-multi-os-directory Display the relative path to OS libraries.\n" msgstr "" -#: gcc.c:3612 +#: gcc.c:3761 msgid " -print-sysroot Display the target libraries directory.\n" msgstr "" -#: gcc.c:3613 +#: gcc.c:3762 msgid "" " -print-sysroot-headers-suffix Display the sysroot suffix used to find " "headers.\n" msgstr "" -#: gcc.c:3614 +#: gcc.c:3763 msgid "" " -Wa, Pass comma-separated on to the " "assembler.\n" msgstr "" -#: gcc.c:3615 +#: gcc.c:3764 msgid "" " -Wp, Pass comma-separated on to the " "preprocessor.\n" msgstr "" -#: gcc.c:3616 +#: gcc.c:3765 msgid "" " -Wl, Pass comma-separated on to the linker.\n" msgstr "" -#: gcc.c:3617 +#: gcc.c:3766 msgid " -Xassembler Pass on to the assembler.\n" msgstr "" -#: gcc.c:3618 +#: gcc.c:3767 msgid " -Xpreprocessor Pass on to the preprocessor.\n" msgstr "" -#: gcc.c:3619 +#: gcc.c:3768 msgid " -Xlinker Pass on to the linker.\n" msgstr "" -#: gcc.c:3620 +#: gcc.c:3769 msgid " -save-temps Do not delete intermediate files.\n" msgstr "" -#: gcc.c:3621 +#: gcc.c:3770 msgid " -save-temps= Do not delete intermediate files.\n" msgstr "" -#: gcc.c:3622 +#: gcc.c:3771 msgid "" " -no-canonical-prefixes Do not canonicalize paths when building relative\n" " prefixes to other gcc components.\n" msgstr "" -#: gcc.c:3625 +#: gcc.c:3774 msgid " -pipe Use pipes rather than intermediate files.\n" msgstr "" -#: gcc.c:3626 +#: gcc.c:3775 msgid " -time Time the execution of each subprocess.\n" msgstr "" -#: gcc.c:3627 +#: gcc.c:3776 msgid "" " -specs= Override built-in specs with the contents of " ".\n" msgstr "" -#: gcc.c:3628 +#: gcc.c:3777 msgid "" " -std= Assume that the input sources are for " ".\n" msgstr "" -#: gcc.c:3629 +#: gcc.c:3778 msgid "" " --sysroot= Use as the root directory for " "headers\n" " and libraries.\n" msgstr "" -#: gcc.c:3632 +#: gcc.c:3781 msgid "" " -B Add to the compiler's search paths.\n" msgstr "" -#: gcc.c:3633 +#: gcc.c:3782 msgid "" " -v Display the programs invoked by the compiler.\n" msgstr "" -#: gcc.c:3634 +#: gcc.c:3783 msgid "" " -### Like -v but options quoted and commands not " "executed.\n" msgstr "" -#: gcc.c:3635 +#: gcc.c:3784 msgid "" " -E Preprocess only; do not compile, assemble or " "link.\n" msgstr "" -#: gcc.c:3636 +#: gcc.c:3785 msgid " -S Compile only; do not assemble or link.\n" msgstr "" -#: gcc.c:3637 +#: gcc.c:3786 msgid " -c Compile and assemble, but do not link.\n" msgstr "" -#: gcc.c:3638 +#: gcc.c:3787 msgid " -o Place the output into .\n" msgstr "" -#: gcc.c:3639 +#: gcc.c:3788 msgid "" " -pie Create a dynamically linked position independent\n" " executable.\n" msgstr "" -#: gcc.c:3641 +#: gcc.c:3790 msgid " -shared Create a shared library.\n" msgstr "" -#: gcc.c:3642 +#: gcc.c:3791 msgid "" " -x Specify the language of the following input " "files.\n" @@ -491,7 +519,7 @@ msgid "" "extension.\n" msgstr "" -#: gcc.c:3649 +#: gcc.c:3798 #, c-format msgid "" "\n" @@ -500,96 +528,96 @@ msgid "" " other options on to these processes the -W options must be used.\n" msgstr "" -#: gcc.c:6540 +#: gcc.c:6668 #, c-format msgid "Processing spec (%s), which is '%s'\n" msgstr "" -#: gcc.c:7301 +#: gcc.c:7429 #, c-format msgid "Target: %s\n" msgstr "" -#: gcc.c:7302 +#: gcc.c:7430 #, c-format msgid "Configured with: %s\n" msgstr "" -#: gcc.c:7316 +#: gcc.c:7444 #, c-format msgid "Thread model: %s\n" msgstr "" -#: gcc.c:7317 +#: gcc.c:7445 #, c-format msgid "Supported LTO compression algorithms: zlib" msgstr "" -#: gcc.c:7319 +#: gcc.c:7447 #, c-format msgid " zstd" msgstr "" -#: gcc.c:7321 gcov.c:1415 gcov.c:1471 gcov.c:1483 gcov.c:2822 +#: gcc.c:7449 gcov.c:1461 gcov.c:1519 gcov.c:1531 gcov.c:2872 #, c-format msgid "\n" msgstr "" -#: gcc.c:7332 +#: gcc.c:7460 #, c-format msgid "gcc version %s %s\n" msgstr "" -#: gcc.c:7335 +#: gcc.c:7463 #, c-format msgid "gcc driver version %s %sexecuting gcc version %s\n" msgstr "" -#: gcc.c:7408 gcc.c:7618 +#: gcc.c:7536 gcc.c:7746 #, c-format msgid "" "The bug is not reproducible, so it is likely a hardware or OS problem.\n" msgstr "" -#: gcc.c:7542 +#: gcc.c:7670 #, c-format msgid "" "Preprocessed source stored into %s file, please attach this to your " "bugreport.\n" msgstr "" -#: gcc.c:8392 +#: gcc.c:8520 #, c-format msgid "install: %s%s\n" msgstr "" -#: gcc.c:8395 +#: gcc.c:8523 #, c-format msgid "programs: %s\n" msgstr "" -#: gcc.c:8397 +#: gcc.c:8525 #, c-format msgid "libraries: %s\n" msgstr "" -#: gcc.c:8514 +#: gcc.c:8642 #, c-format msgid "" "\n" "For bug reporting instructions, please see:\n" msgstr "" -#: gcc.c:8530 gcov-tool.c:527 +#: gcc.c:8658 gcov-tool.c:527 #, c-format msgid "%s %s%s\n" msgstr "" -#: gcc.c:8533 gcov-tool.c:529 gcov.c:934 fortran/gfortranspec.c:282 +#: gcc.c:8661 gcov-tool.c:529 gcov.c:967 fortran/gfortranspec.c:282 msgid "(C)" msgstr "" -#: gcc.c:8534 gcov-tool.c:531 gcov.c:936 fortran/gfortranspec.c:283 +#: gcc.c:8662 gcov-tool.c:531 gcov.c:969 fortran/gfortranspec.c:283 #, c-format msgid "" "This is free software; see the source for copying conditions. There is NO\n" @@ -597,7 +625,7 @@ msgid "" "\n" msgstr "" -#: gcc.c:8877 +#: gcc.c:9005 #, c-format msgid "" "\n" @@ -606,14 +634,14 @@ msgid "" "\n" msgstr "" -#: gcc.c:8878 +#: gcc.c:9006 #, c-format msgid "" "Use \"-Wl,OPTION\" to pass \"OPTION\" to the linker.\n" "\n" msgstr "" -#: gcc.c:10233 +#: gcc.c:10421 #, c-format msgid "" "Assembler options\n" @@ -621,7 +649,7 @@ msgid "" "\n" msgstr "" -#: gcc.c:10234 +#: gcc.c:10422 #, c-format msgid "" "Use \"-Wa,OPTION\" to pass \"OPTION\" to the assembler.\n" @@ -753,7 +781,7 @@ msgid "" " -v, --version Print version number, then exit\n" msgstr "" -#: gcov-tool.c:517 gcov.c:922 +#: gcov-tool.c:517 gcov.c:955 #, c-format msgid "" "\n" @@ -763,374 +791,379 @@ msgstr "" #: gcov-tool.c:528 #, c-format -msgid "Copyright %s 2020 Free Software Foundation, Inc.\n" +msgid "Copyright %s 2021 Free Software Foundation, Inc.\n" msgstr "" -#: gcov.c:892 +#: gcov.c:924 #, c-format msgid "" "Usage: gcov [OPTION...] SOURCE|OBJ...\n" "\n" msgstr "" -#: gcov.c:893 +#: gcov.c:925 #, c-format msgid "" "Print code coverage information.\n" "\n" msgstr "" -#: gcov.c:894 +#: gcov.c:926 #, c-format msgid "" " -a, --all-blocks Show information for every basic block\n" msgstr "" -#: gcov.c:895 +#: gcov.c:927 #, c-format msgid "" " -b, --branch-probabilities Include branch probabilities in output\n" msgstr "" -#: gcov.c:896 +#: gcov.c:928 #, c-format msgid "" " -c, --branch-counts Output counts of branches taken\n" " rather than percentages\n" msgstr "" -#: gcov.c:898 +#: gcov.c:930 #, c-format msgid " -d, --display-progress Display progress information\n" msgstr "" -#: gcov.c:899 +#: gcov.c:931 +#, c-format +msgid " -D, --debug\t\t\t Display debugging dumps\n" +msgstr "" + +#: gcov.c:932 #, c-format msgid " -f, --function-summaries Output summaries for each function\n" msgstr "" -#: gcov.c:900 +#: gcov.c:933 #, c-format msgid " -h, --help Print this help, then exit\n" msgstr "" -#: gcov.c:901 +#: gcov.c:934 #, c-format msgid "" " -j, --json-format Output JSON intermediate format\n" " into .gcov.json.gz file\n" msgstr "" -#: gcov.c:903 +#: gcov.c:936 #, c-format msgid " -H, --human-readable Output human readable numbers\n" msgstr "" -#: gcov.c:904 +#: gcov.c:937 #, c-format msgid " -k, --use-colors Emit colored output\n" msgstr "" -#: gcov.c:905 +#: gcov.c:938 #, c-format msgid "" " -l, --long-file-names Use long output file names for included\n" " source files\n" msgstr "" -#: gcov.c:907 +#: gcov.c:940 #, c-format msgid " -m, --demangled-names Output demangled function names\n" msgstr "" -#: gcov.c:908 +#: gcov.c:941 #, c-format msgid " -n, --no-output Do not create an output file\n" msgstr "" -#: gcov.c:909 +#: gcov.c:942 #, c-format msgid "" " -o, --object-directory DIR|FILE Search for object files in DIR or called " "FILE\n" msgstr "" -#: gcov.c:910 +#: gcov.c:943 #, c-format msgid " -p, --preserve-paths Preserve all pathname components\n" msgstr "" -#: gcov.c:911 +#: gcov.c:944 #, c-format msgid "" " -q, --use-hotness-colors Emit perf-like colored output for hot " "lines\n" msgstr "" -#: gcov.c:912 +#: gcov.c:945 #, c-format msgid " -r, --relative-only Only show data for relative sources\n" msgstr "" -#: gcov.c:913 +#: gcov.c:946 #, c-format msgid " -s, --source-prefix DIR Source prefix to elide\n" msgstr "" -#: gcov.c:914 +#: gcov.c:947 #, c-format msgid " -t, --stdout Output to stdout instead of a file\n" msgstr "" -#: gcov.c:915 +#: gcov.c:948 #, c-format msgid "" " -u, --unconditional-branches Show unconditional branch counts too\n" msgstr "" -#: gcov.c:916 +#: gcov.c:949 #, c-format msgid " -v, --version Print version number, then exit\n" msgstr "" -#: gcov.c:917 +#: gcov.c:950 #, c-format msgid " -w, --verbose Print verbose informations\n" msgstr "" -#: gcov.c:918 +#: gcov.c:951 #, c-format msgid " -x, --hash-filenames Hash long pathnames\n" msgstr "" -#: gcov.c:919 +#: gcov.c:952 #, c-format msgid "" "\n" "Obsolete options:\n" msgstr "" -#: gcov.c:920 +#: gcov.c:953 #, c-format msgid " -i, --json-format Replaced with -j, --json-format\n" msgstr "" -#: gcov.c:921 +#: gcov.c:954 #, c-format msgid " -j, --human-readable Replaced with -H, --human-readable\n" msgstr "" -#: gcov.c:932 +#: gcov.c:965 #, c-format msgid "gcov %s%s\n" msgstr "" -#: gcov.c:1266 +#: gcov.c:1312 #, c-format msgid "'%s' file is already processed\n" msgstr "" -#: gcov.c:1380 +#: gcov.c:1426 #, c-format msgid "Creating '%s'\n" msgstr "" -#: gcov.c:1383 +#: gcov.c:1429 #, c-format msgid "Error writing output file '%s'\n" msgstr "" -#: gcov.c:1388 +#: gcov.c:1434 #, c-format msgid "Could not open output file '%s'\n" msgstr "" -#: gcov.c:1393 +#: gcov.c:1439 #, c-format msgid "Removing '%s'\n" msgstr "" -#: gcov.c:1505 +#: gcov.c:1553 #, c-format msgid "Cannot open JSON output file %s\n" msgstr "" -#: gcov.c:1513 +#: gcov.c:1561 #, c-format msgid "Error writing JSON output file %s\n" msgstr "" -#: gcov.c:1677 +#: gcov.c:1725 #, c-format msgid "%s:source file is newer than notes file '%s'\n" msgstr "" -#: gcov.c:1682 +#: gcov.c:1730 #, c-format msgid "(the message is displayed only once per source file)\n" msgstr "" -#: gcov.c:1702 +#: gcov.c:1750 #, c-format msgid "%s:cannot open notes file\n" msgstr "" -#: gcov.c:1708 +#: gcov.c:1756 #, c-format msgid "%s:not a gcov notes file\n" msgstr "" -#: gcov.c:1721 +#: gcov.c:1769 #, c-format msgid "%s:version '%.4s', prefer '%.4s'\n" msgstr "" -#: gcov.c:1771 +#: gcov.c:1819 #, c-format msgid "%s:already seen blocks for '%s'\n" msgstr "" -#: gcov.c:1885 gcov.c:1992 +#: gcov.c:1935 gcov.c:2042 #, c-format msgid "%s:corrupted\n" msgstr "" -#: gcov.c:1892 +#: gcov.c:1942 #, c-format msgid "%s:no functions found\n" msgstr "" -#: gcov.c:1910 +#: gcov.c:1960 #, c-format msgid "%s:cannot open data file, assuming not executed\n" msgstr "" -#: gcov.c:1917 +#: gcov.c:1967 #, c-format msgid "%s:not a gcov data file\n" msgstr "" -#: gcov.c:1930 +#: gcov.c:1980 #, c-format msgid "%s:version '%.4s', prefer version '%.4s'\n" msgstr "" -#: gcov.c:1936 +#: gcov.c:1986 #, c-format msgid "%s:stamp mismatch with notes file\n" msgstr "" -#: gcov.c:1968 +#: gcov.c:2019 #, c-format msgid "%s:profile mismatch for '%s'\n" msgstr "" -#: gcov.c:1991 +#: gcov.c:2041 #, c-format msgid "%s:overflowed\n" msgstr "" -#: gcov.c:2038 +#: gcov.c:2088 #, c-format msgid "%s:'%s' lacks entry and/or exit blocks\n" msgstr "" -#: gcov.c:2043 +#: gcov.c:2093 #, c-format msgid "%s:'%s' has arcs to entry block\n" msgstr "" -#: gcov.c:2051 +#: gcov.c:2101 #, c-format msgid "%s:'%s' has arcs from exit block\n" msgstr "" -#: gcov.c:2260 +#: gcov.c:2310 #, c-format msgid "%s:graph is unsolvable for '%s'\n" msgstr "" -#: gcov.c:2376 +#: gcov.c:2426 #, c-format msgid "Lines executed:%s of %d\n" msgstr "" -#: gcov.c:2379 +#: gcov.c:2429 #, c-format msgid "No executable lines\n" msgstr "" -#: gcov.c:2387 gcov.c:2396 +#: gcov.c:2437 gcov.c:2446 #, c-format msgid "%s '%s'\n" msgstr "" -#: gcov.c:2403 +#: gcov.c:2453 #, c-format msgid "Branches executed:%s of %d\n" msgstr "" -#: gcov.c:2407 +#: gcov.c:2457 #, c-format msgid "Taken at least once:%s of %d\n" msgstr "" -#: gcov.c:2413 +#: gcov.c:2463 #, c-format msgid "No branches\n" msgstr "" -#: gcov.c:2415 +#: gcov.c:2465 #, c-format msgid "Calls executed:%s of %d\n" msgstr "" -#: gcov.c:2419 +#: gcov.c:2469 #, c-format msgid "No calls\n" msgstr "" -#: gcov.c:2676 +#: gcov.c:2726 #, c-format msgid "%s:no lines for '%s'\n" msgstr "" -#: gcov.c:2802 +#: gcov.c:2852 #, c-format msgid "call %2d returned %s\n" msgstr "" -#: gcov.c:2807 +#: gcov.c:2857 #, c-format msgid "call %2d never executed\n" msgstr "" -#: gcov.c:2812 +#: gcov.c:2862 #, c-format msgid "branch %2d taken %s%s" msgstr "" -#: gcov.c:2817 +#: gcov.c:2867 #, c-format msgid "branch %2d never executed" msgstr "" -#: gcov.c:2820 +#: gcov.c:2870 #, c-format msgid " (BB %d)" msgstr "" -#: gcov.c:2827 +#: gcov.c:2877 #, c-format msgid "unconditional %2d taken %s\n" msgstr "" -#: gcov.c:2830 +#: gcov.c:2880 #, c-format msgid "unconditional %2d never executed\n" msgstr "" -#: gcov.c:3083 +#: gcov.c:3133 #, c-format msgid "Cannot open source file %s\n" msgstr "" @@ -1158,17 +1191,17 @@ msgstr "" msgid "ignoring nonexistent directory \"%s\"\n" msgstr "" -#: incpath.c:385 +#: incpath.c:387 #, c-format msgid "#include \"...\" search starts here:\n" msgstr "" -#: incpath.c:389 +#: incpath.c:391 #, c-format msgid "#include <...> search starts here:\n" msgstr "" -#: incpath.c:394 +#: incpath.c:396 #, c-format msgid "End of search list.\n" msgstr "" @@ -1183,183 +1216,183 @@ msgstr "" msgid "'" msgstr "" -#: langhooks.c:382 +#: langhooks.c:384 msgid "At top level:" msgstr "" -#: langhooks.c:398 cp/error.c:3487 +#: langhooks.c:400 cp/error.c:3566 #, c-format msgid "In member function %qs" msgstr "" -#: langhooks.c:402 cp/error.c:3490 +#: langhooks.c:404 cp/error.c:3569 #, c-format msgid "In function %qs" msgstr "" -#: langhooks.c:447 cp/error.c:3440 +#: langhooks.c:449 cp/error.c:3519 msgid " inlined from %qs at %r%s:%d:%d%R" msgstr "" -#: langhooks.c:452 cp/error.c:3445 +#: langhooks.c:454 cp/error.c:3524 msgid " inlined from %qs at %r%s:%d%R" msgstr "" -#: langhooks.c:458 cp/error.c:3451 +#: langhooks.c:460 cp/error.c:3530 #, c-format msgid " inlined from %qs" msgstr "" -#: lra-assigns.c:1841 reload1.c:2073 +#: lra-assigns.c:1837 reload1.c:2073 msgid "this is the insn:" msgstr "" -#: lra-constraints.c:3021 +#: lra-constraints.c:3113 msgid "unable to generate reloads for impossible constraints:" msgstr "" -#: lra-constraints.c:4012 reload.c:3814 +#: lra-constraints.c:4108 reload.c:3862 msgid "unable to generate reloads for:" msgstr "" #. What to print when a switch has no documentation. -#: opts.c:187 +#: opts.c:188 msgid "This option lacks documentation." msgstr "" -#: opts.c:188 +#: opts.c:189 msgid "Uses of this option are diagnosed." msgstr "" -#: opts.c:1307 +#: opts.c:1372 #, c-format msgid "Same as %s%s (or, in negated form, %s%s)." msgstr "" -#: opts.c:1312 +#: opts.c:1377 #, c-format msgid "Same as %s%s." msgstr "" -#: opts.c:1317 +#: opts.c:1382 #, c-format msgid "Same as %s." msgstr "" -#: opts.c:1325 +#: opts.c:1390 #, c-format msgid "%s Same as %s." msgstr "" -#: opts.c:1388 +#: opts.c:1453 msgid "[available in " msgstr "" -#: opts.c:1420 +#: opts.c:1485 msgid "[default]" msgstr "" -#: opts.c:1429 +#: opts.c:1494 #, c-format msgid "%llu bytes" msgstr "" -#: opts.c:1466 +#: opts.c:1531 msgid "[enabled]" msgstr "" -#: opts.c:1468 +#: opts.c:1533 msgid "[disabled]" msgstr "" -#: opts.c:1504 +#: opts.c:1569 #, c-format msgid " No options with the desired characteristics were found\n" msgstr "" -#: opts.c:1513 +#: opts.c:1578 #, c-format msgid "" " None found. Use --help=%s to show *all* the options supported by the %s " "front-end.\n" msgstr "" -#: opts.c:1519 +#: opts.c:1584 #, c-format msgid "" " All options with the desired characteristics have already been displayed\n" msgstr "" -#: opts.c:1564 +#: opts.c:1629 #, c-format msgid "" " Known valid arguments for %s option:\n" " " msgstr "" -#: opts.c:1614 +#: opts.c:1679 msgid "The following options are target specific" msgstr "" -#: opts.c:1617 +#: opts.c:1682 msgid "The following options control compiler warning messages" msgstr "" -#: opts.c:1620 +#: opts.c:1685 msgid "The following options control optimizations" msgstr "" -#: opts.c:1623 opts.c:1663 +#: opts.c:1688 opts.c:1728 msgid "The following options are language-independent" msgstr "" -#: opts.c:1626 +#: opts.c:1691 msgid "The following options control parameters" msgstr "" -#: opts.c:1632 +#: opts.c:1697 msgid "The following options are specific to just the language " msgstr "" -#: opts.c:1634 +#: opts.c:1699 msgid "The following options are supported by the language " msgstr "" -#: opts.c:1645 +#: opts.c:1710 msgid "The following options are not documented" msgstr "" -#: opts.c:1647 +#: opts.c:1712 msgid "The following options take separate arguments" msgstr "" -#: opts.c:1649 +#: opts.c:1714 msgid "The following options take joined arguments" msgstr "" -#: opts.c:1661 +#: opts.c:1726 msgid "The following options are language-related" msgstr "" -#: passes.c:1785 +#: passes.c:1832 #, c-format msgid "during %s pass: %s\n" msgstr "" -#: passes.c:1790 +#: passes.c:1837 #, c-format msgid "dump file: %s\n" msgstr "" -#: plugin.c:924 +#: plugin.c:926 msgid "Event" msgstr "" -#: plugin.c:924 +#: plugin.c:926 msgid "Plugins" msgstr "" -#: plugin.c:956 +#: plugin.c:958 #, c-format msgid "" "*** WARNING *** there are active plugins, do not report this as a bug unless " @@ -1392,20 +1425,20 @@ msgstr "" msgid "insn does not satisfy its constraints:" msgstr "" -#: targhooks.c:2032 +#: targhooks.c:2075 #, c-format msgid "created and used with differing settings of '%s'" msgstr "" -#: targhooks.c:2047 +#: targhooks.c:2090 msgid "created and used with different settings of %<-fpic%>" msgstr "" -#: targhooks.c:2049 +#: targhooks.c:2092 msgid "created and used with different settings of %<-fpie%>" msgstr "" -#: toplev.c:324 +#: toplev.c:323 #, c-format msgid "unrecoverable error" msgstr "" @@ -1438,16 +1471,8 @@ msgid "" "%s%sGGC heuristics: --param ggc-min-expand=%d --param ggc-min-heapsize=%d\n" msgstr "" -#: toplev.c:790 -msgid "options passed: " -msgstr "" - -#: toplev.c:818 -msgid "options enabled: " -msgstr "" - -#: tree-diagnostic.c:299 c/c-decl.c:5782 c/c-typeck.c:7701 cp/error.c:1075 -#: tree-diagnostic-path.cc:261 c-family/c-pretty-print.c:417 +#: tree-diagnostic.c:299 c/c-decl.c:6025 c/c-typeck.c:7780 cp/error.c:1113 +#: tree-diagnostic-path.cc:257 c-family/c-pretty-print.c:424 #, gcc-internal-format msgid "" msgstr "" @@ -1631,59 +1656,59 @@ msgstr "" msgid "field precision specifier" msgstr "" -#: c-family/c-format.c:559 c-family/c-format.c:583 config/i386/msformat-c.c:44 +#: c-family/c-format.c:559 c-family/c-format.c:583 config/i386/msformat-c.c:45 msgid "' ' flag" msgstr "" -#: c-family/c-format.c:559 c-family/c-format.c:583 config/i386/msformat-c.c:44 +#: c-family/c-format.c:559 c-family/c-format.c:583 config/i386/msformat-c.c:45 msgid "the ' ' printf flag" msgstr "" #: c-family/c-format.c:560 c-family/c-format.c:584 c-family/c-format.c:615 -#: c-family/c-format.c:681 config/i386/msformat-c.c:45 +#: c-family/c-format.c:681 config/i386/msformat-c.c:46 msgid "'+' flag" msgstr "" #: c-family/c-format.c:560 c-family/c-format.c:584 c-family/c-format.c:615 -#: config/i386/msformat-c.c:45 +#: config/i386/msformat-c.c:46 msgid "the '+' printf flag" msgstr "" #: c-family/c-format.c:561 c-family/c-format.c:585 c-family/c-format.c:616 -#: c-family/c-format.c:656 config/i386/msformat-c.c:46 -#: config/i386/msformat-c.c:81 +#: c-family/c-format.c:656 config/i386/msformat-c.c:47 +#: config/i386/msformat-c.c:82 msgid "'#' flag" msgstr "" #: c-family/c-format.c:561 c-family/c-format.c:585 c-family/c-format.c:616 -#: config/i386/msformat-c.c:46 +#: config/i386/msformat-c.c:47 msgid "the '#' printf flag" msgstr "" #: c-family/c-format.c:562 c-family/c-format.c:586 c-family/c-format.c:654 -#: config/i386/msformat-c.c:47 +#: config/i386/msformat-c.c:48 msgid "'0' flag" msgstr "" -#: c-family/c-format.c:562 c-family/c-format.c:586 config/i386/msformat-c.c:47 +#: c-family/c-format.c:562 c-family/c-format.c:586 config/i386/msformat-c.c:48 msgid "the '0' printf flag" msgstr "" #: c-family/c-format.c:563 c-family/c-format.c:587 c-family/c-format.c:653 -#: c-family/c-format.c:684 config/i386/msformat-c.c:48 +#: c-family/c-format.c:684 config/i386/msformat-c.c:49 msgid "'-' flag" msgstr "" -#: c-family/c-format.c:563 c-family/c-format.c:587 config/i386/msformat-c.c:48 +#: c-family/c-format.c:563 c-family/c-format.c:587 config/i386/msformat-c.c:49 msgid "the '-' printf flag" msgstr "" -#: c-family/c-format.c:564 c-family/c-format.c:636 config/i386/msformat-c.c:49 -#: config/i386/msformat-c.c:69 +#: c-family/c-format.c:564 c-family/c-format.c:636 config/i386/msformat-c.c:50 +#: config/i386/msformat-c.c:70 msgid "''' flag" msgstr "" -#: c-family/c-format.c:564 config/i386/msformat-c.c:49 +#: c-family/c-format.c:564 config/i386/msformat-c.c:50 msgid "the ''' printf flag" msgstr "" @@ -1697,33 +1722,33 @@ msgstr "" #: c-family/c-format.c:566 c-family/c-format.c:588 c-family/c-format.c:634 #: c-family/c-format.c:657 c-family/c-format.c:685 config/sol2-c.c:43 -#: config/i386/msformat-c.c:50 config/i386/msformat-c.c:67 +#: config/i386/msformat-c.c:51 config/i386/msformat-c.c:68 msgid "field width" msgstr "" #: c-family/c-format.c:566 c-family/c-format.c:588 config/sol2-c.c:43 -#: config/i386/msformat-c.c:50 +#: config/i386/msformat-c.c:51 msgid "field width in printf format" msgstr "" #: c-family/c-format.c:567 c-family/c-format.c:589 c-family/c-format.c:618 -#: config/i386/msformat-c.c:51 +#: config/i386/msformat-c.c:52 msgid "precision" msgstr "" #: c-family/c-format.c:567 c-family/c-format.c:589 c-family/c-format.c:618 -#: config/i386/msformat-c.c:51 +#: config/i386/msformat-c.c:52 msgid "precision in printf format" msgstr "" #: c-family/c-format.c:568 c-family/c-format.c:590 c-family/c-format.c:619 #: c-family/c-format.c:635 c-family/c-format.c:688 config/sol2-c.c:44 -#: config/i386/msformat-c.c:52 config/i386/msformat-c.c:68 +#: config/i386/msformat-c.c:53 config/i386/msformat-c.c:69 msgid "length modifier" msgstr "" #: c-family/c-format.c:568 c-family/c-format.c:590 c-family/c-format.c:619 -#: config/sol2-c.c:44 config/i386/msformat-c.c:52 +#: config/sol2-c.c:44 config/i386/msformat-c.c:53 msgid "length modifier in printf format" msgstr "" @@ -1735,19 +1760,19 @@ msgstr "" msgid "the 'q' diagnostic flag" msgstr "" -#: c-family/c-format.c:631 config/i386/msformat-c.c:65 +#: c-family/c-format.c:631 config/i386/msformat-c.c:66 msgid "assignment suppression" msgstr "" -#: c-family/c-format.c:631 config/i386/msformat-c.c:65 +#: c-family/c-format.c:631 config/i386/msformat-c.c:66 msgid "the assignment suppression scanf feature" msgstr "" -#: c-family/c-format.c:632 config/i386/msformat-c.c:66 +#: c-family/c-format.c:632 config/i386/msformat-c.c:67 msgid "'a' flag" msgstr "" -#: c-family/c-format.c:632 config/i386/msformat-c.c:66 +#: c-family/c-format.c:632 config/i386/msformat-c.c:67 msgid "the 'a' scanf flag" msgstr "" @@ -1759,15 +1784,15 @@ msgstr "" msgid "the 'm' scanf flag" msgstr "" -#: c-family/c-format.c:634 config/i386/msformat-c.c:67 +#: c-family/c-format.c:634 config/i386/msformat-c.c:68 msgid "field width in scanf format" msgstr "" -#: c-family/c-format.c:635 config/i386/msformat-c.c:68 +#: c-family/c-format.c:635 config/i386/msformat-c.c:69 msgid "length modifier in scanf format" msgstr "" -#: c-family/c-format.c:636 config/i386/msformat-c.c:69 +#: c-family/c-format.c:636 config/i386/msformat-c.c:70 msgid "the ''' scanf flag" msgstr "" @@ -1799,7 +1824,7 @@ msgstr "" msgid "the '^' strftime flag" msgstr "" -#: c-family/c-format.c:656 config/i386/msformat-c.c:81 +#: c-family/c-format.c:656 config/i386/msformat-c.c:82 msgid "the '#' strftime flag" msgstr "" @@ -1888,87 +1913,87 @@ msgid "length modifier in strfmon format" msgstr "" #. Handle deferred options from command-line. -#: c-family/c-opts.c:1452 fortran/cpp.c:590 +#: c-family/c-opts.c:1482 fortran/cpp.c:592 msgid "" msgstr "" -#: config/aarch64/aarch64.c:10009 +#: config/aarch64/aarch64.c:10256 #, c-format msgid "unsupported operand for code '%c'" msgstr "" -#: config/aarch64/aarch64.c:10018 config/aarch64/aarch64.c:10031 -#: config/aarch64/aarch64.c:10043 config/aarch64/aarch64.c:10054 -#: config/aarch64/aarch64.c:10070 config/aarch64/aarch64.c:10084 -#: config/aarch64/aarch64.c:10104 config/aarch64/aarch64.c:10178 -#: config/aarch64/aarch64.c:10189 config/aarch64/aarch64.c:10203 -#: config/aarch64/aarch64.c:10425 config/aarch64/aarch64.c:10443 +#: config/aarch64/aarch64.c:10265 config/aarch64/aarch64.c:10278 +#: config/aarch64/aarch64.c:10290 config/aarch64/aarch64.c:10301 +#: config/aarch64/aarch64.c:10317 config/aarch64/aarch64.c:10331 +#: config/aarch64/aarch64.c:10351 config/aarch64/aarch64.c:10425 +#: config/aarch64/aarch64.c:10436 config/aarch64/aarch64.c:10450 +#: config/aarch64/aarch64.c:10672 config/aarch64/aarch64.c:10690 #: config/pru/pru.c:1669 config/pru/pru.c:1679 config/pru/pru.c:1710 #: config/pru/pru.c:1721 config/pru/pru.c:1793 #, c-format msgid "invalid operand for '%%%c'" msgstr "" -#: config/aarch64/aarch64.c:10122 config/aarch64/aarch64.c:10133 -#: config/aarch64/aarch64.c:10285 config/aarch64/aarch64.c:10296 +#: config/aarch64/aarch64.c:10369 config/aarch64/aarch64.c:10380 +#: config/aarch64/aarch64.c:10532 config/aarch64/aarch64.c:10543 #, c-format msgid "invalid vector constant" msgstr "" -#: config/aarch64/aarch64.c:10145 config/aarch64/aarch64.c:10157 +#: config/aarch64/aarch64.c:10392 config/aarch64/aarch64.c:10404 #, c-format msgid "incompatible floating point / vector register operand for '%%%c'" msgstr "" -#: config/aarch64/aarch64.c:10171 +#: config/aarch64/aarch64.c:10418 #, c-format msgid "incompatible register operand for '%%%c'" msgstr "" -#: config/aarch64/aarch64.c:10237 config/arm/arm.c:24256 +#: config/aarch64/aarch64.c:10484 config/arm/arm.c:24281 #, c-format msgid "missing operand" msgstr "" -#: config/aarch64/aarch64.c:10322 +#: config/aarch64/aarch64.c:10569 #, c-format msgid "invalid constant" msgstr "" -#: config/aarch64/aarch64.c:10325 +#: config/aarch64/aarch64.c:10572 #, c-format msgid "invalid operand" msgstr "" -#: config/aarch64/aarch64.c:10451 config/aarch64/aarch64.c:10456 +#: config/aarch64/aarch64.c:10698 config/aarch64/aarch64.c:10703 #, c-format msgid "invalid operand prefix '%%%c'" msgstr "" -#: config/aarch64/aarch64.c:10476 +#: config/aarch64/aarch64.c:10723 #, c-format msgid "invalid address mode" msgstr "" -#: config/aarch64/aarch64.c:23021 config/arm/arm.c:33216 +#: config/aarch64/aarch64.c:23521 config/arm/arm.c:33636 msgid "invalid conversion from type %" msgstr "" -#: config/aarch64/aarch64.c:23023 config/arm/arm.c:33218 +#: config/aarch64/aarch64.c:23523 config/arm/arm.c:33638 msgid "invalid conversion to type %" msgstr "" -#: config/aarch64/aarch64.c:23038 config/aarch64/aarch64.c:23054 -#: config/arm/arm.c:33233 config/arm/arm.c:33249 +#: config/aarch64/aarch64.c:23538 config/aarch64/aarch64.c:23554 +#: config/arm/arm.c:33653 config/arm/arm.c:33669 msgid "operation not permitted on type %" msgstr "" -#: config/aarch64/aarch64.c:23062 +#: config/aarch64/aarch64.c:23562 msgid "cannot combine GNU and SVE vectors in a binary operation" msgstr "" -#: config/alpha/alpha.c:5076 config/i386/i386.c:12938 -#: config/rs6000/rs6000.c:13446 config/sparc/sparc.c:9351 +#: config/alpha/alpha.c:5076 config/i386/i386.c:13215 +#: config/rs6000/rs6000.c:13975 config/sparc/sparc.c:9320 #, c-format msgid "'%%&' used without any local dynamic TLS references" msgstr "" @@ -1984,18 +2009,18 @@ msgid "invalid %%r value" msgstr "" #: config/alpha/alpha.c:5174 config/ia64/ia64.c:5531 -#: config/rs6000/rs6000.c:13140 config/xtensa/xtensa.c:2444 +#: config/rs6000/rs6000.c:13669 config/xtensa/xtensa.c:2459 #, c-format msgid "invalid %%R value" msgstr "" -#: config/alpha/alpha.c:5180 config/rs6000/rs6000.c:13060 -#: config/xtensa/xtensa.c:2411 +#: config/alpha/alpha.c:5180 config/rs6000/rs6000.c:13589 +#: config/xtensa/xtensa.c:2426 #, c-format msgid "invalid %%N value" msgstr "" -#: config/alpha/alpha.c:5188 config/rs6000/rs6000.c:13088 +#: config/alpha/alpha.c:5188 config/rs6000/rs6000.c:13617 #, c-format msgid "invalid %%P value" msgstr "" @@ -2005,7 +2030,7 @@ msgstr "" msgid "invalid %%h value" msgstr "" -#: config/alpha/alpha.c:5204 config/xtensa/xtensa.c:2437 +#: config/alpha/alpha.c:5204 config/xtensa/xtensa.c:2452 #, c-format msgid "invalid %%L value" msgstr "" @@ -2025,7 +2050,7 @@ msgstr "" msgid "invalid %%U value" msgstr "" -#: config/alpha/alpha.c:5274 config/rs6000/rs6000.c:13148 +#: config/alpha/alpha.c:5274 config/rs6000/rs6000.c:13677 #, c-format msgid "invalid %%s value" msgstr "" @@ -2035,7 +2060,7 @@ msgstr "" msgid "invalid %%C value" msgstr "" -#: config/alpha/alpha.c:5322 config/rs6000/rs6000.c:12924 +#: config/alpha/alpha.c:5322 config/rs6000/rs6000.c:13453 #, c-format msgid "invalid %%E value" msgstr "" @@ -2045,10 +2070,10 @@ msgstr "" msgid "unknown relocation unspec" msgstr "" -#: config/alpha/alpha.c:5356 config/cr16/cr16.c:1570 config/gcn/gcn.c:5764 -#: config/gcn/gcn.c:5773 config/gcn/gcn.c:5833 config/gcn/gcn.c:5841 -#: config/gcn/gcn.c:5857 config/gcn/gcn.c:5875 config/gcn/gcn.c:5926 -#: config/gcn/gcn.c:6045 config/gcn/gcn.c:6156 config/rs6000/rs6000.c:13451 +#: config/alpha/alpha.c:5356 config/cr16/cr16.c:1570 config/gcn/gcn.c:5796 +#: config/gcn/gcn.c:5805 config/gcn/gcn.c:5865 config/gcn/gcn.c:5873 +#: config/gcn/gcn.c:5889 config/gcn/gcn.c:5907 config/gcn/gcn.c:5958 +#: config/gcn/gcn.c:6077 config/gcn/gcn.c:6188 config/rs6000/rs6000.c:13980 #, c-format msgid "invalid %%xn code" msgstr "" @@ -2116,7 +2141,7 @@ msgstr "" #. Unknown flag. #. Undocumented flag. #: config/arc/arc.c:4949 config/epiphany/epiphany.c:1307 -#: config/m32r/m32r.c:2232 config/nds32/nds32.c:3517 config/sparc/sparc.c:9630 +#: config/m32r/m32r.c:2232 config/nds32/nds32.c:3517 config/sparc/sparc.c:9599 #, c-format msgid "invalid operand output code" msgstr "" @@ -2130,35 +2155,35 @@ msgstr "" msgid "unrecognized supposed constant" msgstr "" -#: config/arm/arm.c:20631 config/arm/arm.c:20656 config/arm/arm.c:20666 -#: config/arm/arm.c:20675 config/arm/arm.c:20684 +#: config/arm/arm.c:20645 config/arm/arm.c:20670 config/arm/arm.c:20680 +#: config/arm/arm.c:20689 config/arm/arm.c:20698 #, c-format msgid "invalid shift operand" msgstr "" -#: config/arm/arm.c:23540 config/arm/arm.c:23558 +#: config/arm/arm.c:23554 config/arm/arm.c:23572 #, c-format msgid "predicated Thumb instruction" msgstr "" -#: config/arm/arm.c:23546 +#: config/arm/arm.c:23560 #, c-format msgid "predicated instruction in conditional sequence" msgstr "" -#: config/arm/arm.c:23664 config/arm/arm.c:23677 config/arm/arm.c:23702 -#: config/nios2/nios2.c:3086 +#: config/arm/arm.c:23678 config/arm/arm.c:23691 config/arm/arm.c:23716 +#: config/nios2/nios2.c:3079 #, c-format msgid "Unsupported operand for code '%c'" msgstr "" -#: config/arm/arm.c:23779 config/arm/arm.c:23801 config/arm/arm.c:23811 -#: config/arm/arm.c:23821 config/arm/arm.c:23831 config/arm/arm.c:23870 -#: config/arm/arm.c:23888 config/arm/arm.c:23913 config/arm/arm.c:23928 -#: config/arm/arm.c:23955 config/arm/arm.c:23962 config/arm/arm.c:23980 -#: config/arm/arm.c:23987 config/arm/arm.c:23995 config/arm/arm.c:24016 -#: config/arm/arm.c:24023 config/arm/arm.c:24203 config/arm/arm.c:24210 -#: config/arm/arm.c:24237 config/arm/arm.c:24244 config/bfin/bfin.c:1440 +#: config/arm/arm.c:23793 config/arm/arm.c:23815 config/arm/arm.c:23825 +#: config/arm/arm.c:23835 config/arm/arm.c:23845 config/arm/arm.c:23884 +#: config/arm/arm.c:23902 config/arm/arm.c:23927 config/arm/arm.c:23942 +#: config/arm/arm.c:23969 config/arm/arm.c:23976 config/arm/arm.c:23994 +#: config/arm/arm.c:24001 config/arm/arm.c:24009 config/arm/arm.c:24030 +#: config/arm/arm.c:24037 config/arm/arm.c:24228 config/arm/arm.c:24235 +#: config/arm/arm.c:24262 config/arm/arm.c:24269 config/bfin/bfin.c:1440 #: config/bfin/bfin.c:1447 config/bfin/bfin.c:1454 config/bfin/bfin.c:1461 #: config/bfin/bfin.c:1470 config/bfin/bfin.c:1477 config/bfin/bfin.c:1484 #: config/bfin/bfin.c:1491 config/nds32/nds32.c:3543 @@ -2166,13 +2191,13 @@ msgstr "" msgid "invalid operand for code '%c'" msgstr "" -#: config/arm/arm.c:23883 +#: config/arm/arm.c:23897 #, c-format msgid "instruction never executed" msgstr "" #. Former Maverick support, removed after GCC-4.7. -#: config/arm/arm.c:23904 +#: config/arm/arm.c:23918 #, c-format msgid "obsolete Maverick format code '%c'" msgstr "" @@ -2276,23 +2301,23 @@ msgstr "" msgid "invalid %%j value" msgstr "" -#: config/bfin/bfin.c:1582 config/c6x/c6x.c:2277 +#: config/bfin/bfin.c:1582 config/c6x/c6x.c:2278 #, c-format msgid "invalid const_double operand" msgstr "" -#: config/bpf/bpf.c:762 +#: config/bpf/bpf.c:776 msgid "invalid address in operand" msgstr "" #. Fallthrough. -#: config/bpf/bpf.c:769 +#: config/bpf/bpf.c:783 msgid "unsupported operand" msgstr "" #: config/cris/cris.c:775 config/ft32/ft32.c:110 config/moxie/moxie.c:108 -#: final.c:3607 final.c:3609 fold-const.c:266 gcc.c:5902 gcc.c:5916 -#: rtl-error.c:101 toplev.c:328 vr-values.c:2479 cp/typeck.c:6780 +#: final.c:3625 final.c:3627 fold-const.c:267 gcc.c:6030 gcc.c:6044 +#: rtl-error.c:101 toplev.c:327 vr-values.c:2370 cp/typeck.c:6920 #: lto/lto-object.c:184 lto/lto-object.c:281 lto/lto-object.c:338 #: lto/lto-object.c:362 #, gcc-internal-format, gfc-internal-format @@ -2499,133 +2524,128 @@ msgstr "" msgid "bad output_condmove_single operand" msgstr "" -#: config/gcn/gcn.c:5434 config/gcn/gcn.c:5458 config/gcn/gcn.c:5462 -#: config/gcn/gcn.c:5806 config/gcn/gcn.c:5817 config/gcn/gcn.c:5820 +#: config/gcn/gcn.c:5466 config/gcn/gcn.c:5490 config/gcn/gcn.c:5494 +#: config/gcn/gcn.c:5838 config/gcn/gcn.c:5849 config/gcn/gcn.c:5852 #, c-format msgid "bad ADDR_SPACE_GLOBAL address" msgstr "" -#: config/gcn/gcn.c:5574 config/gcn/gcn.c:5597 config/gcn/gcn.c:5629 -#: config/gcn/gcn.c:5645 config/gcn/gcn.c:5660 config/gcn/gcn.c:5679 -#: config/gcn/gcn.c:5755 config/gcn/gcn.c:5951 config/gcn/gcn.c:6066 +#: config/gcn/gcn.c:5606 config/gcn/gcn.c:5629 config/gcn/gcn.c:5661 +#: config/gcn/gcn.c:5677 config/gcn/gcn.c:5692 config/gcn/gcn.c:5711 +#: config/gcn/gcn.c:5787 config/gcn/gcn.c:5983 config/gcn/gcn.c:6098 #, c-format msgid "invalid operand %%xn code" msgstr "" -#: config/gcn/gcn.c:6054 +#: config/gcn/gcn.c:6086 #, c-format msgid "operand %%xn code invalid for QImode" msgstr "" -#: config/gcn/gcn.c:6136 +#: config/gcn/gcn.c:6168 #, c-format msgid "invalid fp constant" msgstr "" -#: config/h8300/h8300.c:1545 config/h8300/h8300.c:1553 -#: config/h8300/h8300.c:1561 config/h8300/h8300.c:1569 -#: config/h8300/h8300.c:1577 config/h8300/h8300.c:1585 +#: config/h8300/h8300.c:1565 config/h8300/h8300.c:1573 +#: config/h8300/h8300.c:1581 config/h8300/h8300.c:1589 +#: config/h8300/h8300.c:1597 config/h8300/h8300.c:1605 #, c-format msgid "Expected register or constant integer." msgstr "" -#: config/i386/i386.c:11729 +#: config/i386/i386.c:12041 #, c-format msgid "invalid UNSPEC as operand" msgstr "" -#: config/i386/i386.c:12268 +#: config/i386/i386.c:12580 #, c-format msgid "invalid use of register '%s'" msgstr "" -#: config/i386/i386.c:12273 +#: config/i386/i386.c:12585 #, c-format msgid "invalid use of asm flag output" msgstr "" -#: config/i386/i386.c:12506 +#: config/i386/i386.c:12817 #, c-format msgid "invalid operand size for operand code 'O'" msgstr "" -#: config/i386/i386.c:12541 +#: config/i386/i386.c:12852 #, c-format msgid "invalid operand size for operand code 'z'" msgstr "" -#: config/i386/i386.c:12610 +#: config/i386/i386.c:12921 #, c-format msgid "invalid operand type used with operand code 'Z'" msgstr "" -#: config/i386/i386.c:12615 +#: config/i386/i386.c:12926 #, c-format msgid "invalid operand size for operand code 'Z'" msgstr "" -#: config/i386/i386.c:12670 -#, c-format -msgid "operand is not a condition code, invalid operand code 'I'" -msgstr "" - -#: config/i386/i386.c:12726 +#: config/i386/i386.c:13003 #, c-format msgid "operand is not a condition code, invalid operand code 'Y'" msgstr "" -#: config/i386/i386.c:12805 +#: config/i386/i386.c:13082 #, c-format msgid "operand is not a condition code, invalid operand code 'D'" msgstr "" -#: config/i386/i386.c:12823 +#: config/i386/i386.c:13100 #, c-format msgid "operand is not a condition code, invalid operand code '%c'" msgstr "" -#: config/i386/i386.c:12836 +#: config/i386/i386.c:13113 #, c-format msgid "" "operand is not an offsettable memory reference, invalid operand code 'H'" msgstr "" -#: config/i386/i386.c:12851 +#: config/i386/i386.c:13128 #, c-format msgid "operand is not an integer, invalid operand code 'K'" msgstr "" -#: config/i386/i386.c:12879 +#: config/i386/i386.c:13156 #, c-format msgid "operand is not a specific integer, invalid operand code 'r'" msgstr "" -#: config/i386/i386.c:12897 +#: config/i386/i386.c:13174 #, c-format msgid "operand is not an integer, invalid operand code 'R'" msgstr "" -#: config/i386/i386.c:12920 +#: config/i386/i386.c:13197 #, c-format msgid "operand is not a specific integer, invalid operand code 'R'" msgstr "" -#: config/i386/i386.c:13024 +#: config/i386/i386.c:13301 #, c-format msgid "invalid operand code '%c'" msgstr "" -#: config/i386/i386.c:13086 +#: config/i386/i386.c:13363 #, c-format msgid "invalid constraints for operand" msgstr "" -#: config/i386/i386.c:13136 +#: config/i386/i386.c:13450 #, c-format msgid "invalid vector immediate" msgstr "" -#: config/i386/i386.c:16068 +#: config/i386/i386.c:16403 msgid "unknown insn mode" msgstr "" @@ -2656,13 +2676,13 @@ msgstr "" msgid "invalid operation on %<__fpreg%>" msgstr "" -#: config/iq2000/iq2000.c:3126 config/tilegx/tilegx.c:5303 -#: config/tilepro/tilepro.c:4692 +#: config/iq2000/iq2000.c:3126 config/tilegx/tilegx.c:5301 +#: config/tilepro/tilepro.c:4690 #, c-format msgid "invalid %%P operand" msgstr "" -#: config/iq2000/iq2000.c:3134 config/rs6000/rs6000.c:13078 +#: config/iq2000/iq2000.c:3134 config/rs6000/rs6000.c:13607 #, c-format msgid "invalid %%p value" msgstr "" @@ -2715,7 +2735,7 @@ msgstr "" msgid "post-increment address is not a register" msgstr "" -#: config/m32r/m32r.c:2335 config/m32r/m32r.c:2350 config/rs6000/rs6000.c:19869 +#: config/m32r/m32r.c:2335 config/m32r/m32r.c:2350 config/rs6000/rs6000.c:20448 msgid "bad address" msgstr "" @@ -2748,7 +2768,7 @@ msgid "insn contains an invalid address !" msgstr "" #: config/microblaze/microblaze.c:2402 config/microblaze/microblaze.c:2632 -#: config/xtensa/xtensa.c:2541 +#: config/xtensa/xtensa.c:2556 msgid "invalid address" msgstr "" @@ -2767,59 +2787,66 @@ msgstr "" #: config/mips/mips.c:9084 config/mips/mips.c:9087 config/mips/mips.c:9099 #: config/mips/mips.c:9102 config/mips/mips.c:9162 config/mips/mips.c:9169 #: config/mips/mips.c:9190 config/mips/mips.c:9205 config/mips/mips.c:9224 -#: config/mips/mips.c:9233 config/riscv/riscv.c:3294 config/riscv/riscv.c:3409 -#: config/riscv/riscv.c:3415 config/riscv/riscv.c:3424 +#: config/mips/mips.c:9233 config/riscv/riscv.c:3299 config/riscv/riscv.c:3414 +#: config/riscv/riscv.c:3420 config/riscv/riscv.c:3429 #, c-format msgid "invalid use of '%%%c'" msgstr "" -#: config/mmix/mmix.c:1619 config/mmix/mmix.c:1749 +#: config/mmix/mmix.c:1622 config/mmix/mmix.c:1752 msgid "MMIX Internal: Expected a CONST_INT, not this" msgstr "" -#: config/mmix/mmix.c:1698 +#: config/mmix/mmix.c:1701 msgid "MMIX Internal: Bad value for 'm', not a CONST_INT" msgstr "" -#: config/mmix/mmix.c:1717 +#: config/mmix/mmix.c:1720 msgid "MMIX Internal: Expected a register, not this" msgstr "" -#: config/mmix/mmix.c:1727 +#: config/mmix/mmix.c:1730 msgid "MMIX Internal: Expected a constant, not this" msgstr "" #. We need the original here. -#: config/mmix/mmix.c:1811 +#: config/mmix/mmix.c:1814 msgid "MMIX Internal: Cannot decode this operand" msgstr "" -#: config/mmix/mmix.c:1867 +#: config/mmix/mmix.c:1870 msgid "MMIX Internal: This is not a recognized address" msgstr "" -#: config/mmix/mmix.c:2743 +#: config/mmix/mmix.c:2762 msgid "MMIX Internal: Trying to output invalidly reversed condition:" msgstr "" -#: config/mmix/mmix.c:2750 +#: config/mmix/mmix.c:2769 msgid "MMIX Internal: What's the CC of this?" msgstr "" -#: config/mmix/mmix.c:2754 +#: config/mmix/mmix.c:2773 msgid "MMIX Internal: What is the CC of this?" msgstr "" -#: config/mmix/mmix.c:2796 +#: config/mmix/mmix.c:2815 msgid "MMIX Internal: This is not a constant:" msgstr "" -#: config/msp430/msp430.c:3586 +#: config/msp430/msp430.c:4230 +#, c-format +msgid "" +"%%d, %%e, %%f, %%g operand modifiers are for memory references or constant " +"values only" +msgstr "" + +#: config/msp430/msp430.c:4343 #, c-format msgid "invalid operand prefix" msgstr "" -#: config/msp430/msp430.c:3620 +#: config/msp430/msp430.c:4377 #, c-format msgid "invalid zero extract" msgstr "" @@ -2834,7 +2861,7 @@ msgstr "" msgid "invalid %%H value" msgstr "" -#: config/or1k/or1k.c:1231 config/xtensa/xtensa.c:2458 +#: config/or1k/or1k.c:1231 config/xtensa/xtensa.c:2473 #, c-format msgid "invalid %%d value" msgstr "" @@ -2899,294 +2926,286 @@ msgstr "" msgid "Try running '%s' in the shell to raise its limit.\n" msgstr "" -#: config/rs6000/rs6000.c:3696 +#: config/rs6000/rs6000.c:3831 msgid "%<-mvsx%> requires hardware floating point" msgstr "" -#: config/rs6000/rs6000.c:3704 +#: config/rs6000/rs6000.c:3839 msgid "%<-mvsx%> needs indexed addressing" msgstr "" -#: config/rs6000/rs6000.c:3709 +#: config/rs6000/rs6000.c:3844 msgid "%<-mvsx%> and %<-mno-altivec%> are incompatible" msgstr "" -#: config/rs6000/rs6000.c:3711 +#: config/rs6000/rs6000.c:3846 msgid "%<-mno-altivec%> disables vsx" msgstr "" -#: config/rs6000/rs6000.c:3845 +#: config/rs6000/rs6000.c:3986 msgid "%<-mquad-memory%> requires 64-bit mode" msgstr "" -#: config/rs6000/rs6000.c:3848 +#: config/rs6000/rs6000.c:3989 msgid "%<-mquad-memory-atomic%> requires 64-bit mode" msgstr "" -#: config/rs6000/rs6000.c:3860 +#: config/rs6000/rs6000.c:4001 msgid "%<-mquad-memory%> is not available in little endian mode" msgstr "" -#: config/rs6000/rs6000.c:10144 +#: config/rs6000/rs6000.c:10673 msgid "bad move" msgstr "" -#: config/rs6000/rs6000.c:12708 +#: config/rs6000/rs6000.c:13237 msgid "Bad 128-bit move" msgstr "" -#: config/rs6000/rs6000.c:12888 +#: config/rs6000/rs6000.c:13417 #, c-format msgid "invalid %%A value" msgstr "" -#: config/rs6000/rs6000.c:12897 config/xtensa/xtensa.c:2387 +#: config/rs6000/rs6000.c:13426 config/xtensa/xtensa.c:2402 #, c-format msgid "invalid %%D value" msgstr "" -#: config/rs6000/rs6000.c:12912 +#: config/rs6000/rs6000.c:13441 #, c-format msgid "invalid %%e value" msgstr "" -#: config/rs6000/rs6000.c:12933 +#: config/rs6000/rs6000.c:13462 #, c-format msgid "invalid %%f value" msgstr "" -#: config/rs6000/rs6000.c:12942 +#: config/rs6000/rs6000.c:13471 #, c-format msgid "invalid %%F value" msgstr "" -#: config/rs6000/rs6000.c:12951 +#: config/rs6000/rs6000.c:13480 #, c-format msgid "invalid %%G value" msgstr "" -#: config/rs6000/rs6000.c:12986 +#: config/rs6000/rs6000.c:13515 #, c-format msgid "invalid %%j code" msgstr "" -#: config/rs6000/rs6000.c:12996 +#: config/rs6000/rs6000.c:13525 #, c-format msgid "invalid %%J code" msgstr "" -#: config/rs6000/rs6000.c:13006 +#: config/rs6000/rs6000.c:13535 #, c-format msgid "invalid %%k value" msgstr "" -#: config/rs6000/rs6000.c:13021 config/xtensa/xtensa.c:2430 +#: config/rs6000/rs6000.c:13550 config/xtensa/xtensa.c:2445 #, c-format msgid "invalid %%K value" msgstr "" -#: config/rs6000/rs6000.c:13068 +#: config/rs6000/rs6000.c:13597 #, c-format msgid "invalid %%O value" msgstr "" -#: config/rs6000/rs6000.c:13115 +#: config/rs6000/rs6000.c:13644 #, c-format msgid "invalid %%q value" msgstr "" -#: config/rs6000/rs6000.c:13157 +#: config/rs6000/rs6000.c:13686 #, c-format msgid "invalid %%t value" msgstr "" -#: config/rs6000/rs6000.c:13174 +#: config/rs6000/rs6000.c:13703 #, c-format msgid "invalid %%T value" msgstr "" -#: config/rs6000/rs6000.c:13186 +#: config/rs6000/rs6000.c:13715 #, c-format msgid "invalid %%u value" msgstr "" -#: config/rs6000/rs6000.c:13200 config/xtensa/xtensa.c:2399 +#: config/rs6000/rs6000.c:13729 config/xtensa/xtensa.c:2414 #, c-format msgid "invalid %%v value" msgstr "" -#: config/rs6000/rs6000.c:13250 +#: config/rs6000/rs6000.c:13779 #, c-format msgid "invalid %%V value" msgstr "" -#: config/rs6000/rs6000.c:13267 config/xtensa/xtensa.c:2451 +#: config/rs6000/rs6000.c:13796 config/xtensa/xtensa.c:2466 #, c-format msgid "invalid %%x value" msgstr "" -#: config/rs6000/rs6000.c:13324 +#: config/rs6000/rs6000.c:13853 #, c-format msgid "invalid %%z value" msgstr "" -#: config/rs6000/rs6000.c:13393 +#: config/rs6000/rs6000.c:13922 #, c-format msgid "invalid %%y value, try using the 'Z' constraint" msgstr "" -#: config/rs6000/rs6000.c:14237 -msgid "__float128 and __ibm128 cannot be used in the same expression" -msgstr "" - -#: config/rs6000/rs6000.c:14243 -msgid "__ibm128 and long double cannot be used in the same expression" +#: config/rs6000/rs6000.c:14766 +msgid "Invalid mixing of IEEE 128-bit and IBM 128-bit floating point types" msgstr "" -#: config/rs6000/rs6000.c:14249 -msgid "__float128 and long double cannot be used in the same expression" -msgstr "" - -#: config/rs6000/rs6000.c:23128 +#: config/rs6000/rs6000.c:23725 msgid "AltiVec argument passed to unprototyped function" msgstr "" -#: config/rs6000/rs6000.c:26145 +#: config/rs6000/rs6000.c:26824 msgid "Could not generate addis value for fusion" msgstr "" -#: config/rs6000/rs6000.c:26214 +#: config/rs6000/rs6000.c:26893 msgid "Unable to generate load/store offset for fusion" msgstr "" -#: config/rs6000/rs6000.c:26290 +#: config/rs6000/rs6000.c:26969 msgid "Bad GPR fusion" msgstr "" -#: config/rs6000/rs6000.c:26769 +#: config/rs6000/rs6000.c:27529 msgid "invalid conversion from type %<__vector_quad%>" msgstr "" -#: config/rs6000/rs6000.c:26771 +#: config/rs6000/rs6000.c:27531 msgid "invalid conversion to type %<__vector_quad%>" msgstr "" -#: config/rs6000/rs6000.c:26773 +#: config/rs6000/rs6000.c:27533 msgid "invalid conversion from type %<__vector_pair%>" msgstr "" -#: config/rs6000/rs6000.c:26775 +#: config/rs6000/rs6000.c:27535 msgid "invalid conversion to type %<__vector_pair%>" msgstr "" -#: config/rs6000/rs6000.c:26783 +#: config/rs6000/rs6000.c:27550 msgid "invalid conversion from type %<* __vector_quad%>" msgstr "" -#: config/rs6000/rs6000.c:26786 +#: config/rs6000/rs6000.c:27552 msgid "invalid conversion to type %<* __vector_quad%>" msgstr "" -#: config/rs6000/rs6000.c:26789 +#: config/rs6000/rs6000.c:27554 msgid "invalid conversion from type %<* __vector_pair%>" msgstr "" -#: config/rs6000/rs6000.c:26792 +#: config/rs6000/rs6000.c:27556 msgid "invalid conversion to type %<* __vector_pair%>" msgstr "" -#: config/s390/s390.c:7792 +#: config/s390/s390.c:7867 #, c-format msgid "symbolic memory references are only supported on z10 or later" msgstr "" -#: config/s390/s390.c:7803 +#: config/s390/s390.c:7878 #, c-format msgid "cannot decompose address" msgstr "" -#: config/s390/s390.c:7883 +#: config/s390/s390.c:7959 #, c-format msgid "invalid comparison operator for 'E' output modifier" msgstr "" -#: config/s390/s390.c:7906 +#: config/s390/s390.c:7982 #, c-format msgid "invalid reference for 'J' output modifier" msgstr "" -#: config/s390/s390.c:7924 +#: config/s390/s390.c:8000 #, c-format msgid "invalid address for 'O' output modifier" msgstr "" -#: config/s390/s390.c:7946 +#: config/s390/s390.c:8022 #, c-format msgid "invalid address for 'R' output modifier" msgstr "" -#: config/s390/s390.c:7964 +#: config/s390/s390.c:8040 #, c-format msgid "memory reference expected for 'S' output modifier" msgstr "" -#: config/s390/s390.c:7974 +#: config/s390/s390.c:8050 #, c-format msgid "invalid address for 'S' output modifier" msgstr "" -#: config/s390/s390.c:7995 +#: config/s390/s390.c:8071 #, c-format msgid "register or memory expression expected for 'N' output modifier" msgstr "" -#: config/s390/s390.c:8006 +#: config/s390/s390.c:8082 #, c-format msgid "register or memory expression expected for 'M' output modifier" msgstr "" -#: config/s390/s390.c:8092 config/s390/s390.c:8113 +#: config/s390/s390.c:8168 config/s390/s390.c:8189 #, c-format msgid "invalid constant for output modifier '%c'" msgstr "" -#: config/s390/s390.c:8110 +#: config/s390/s390.c:8186 #, c-format msgid "invalid constant - try using an output modifier" msgstr "" -#: config/s390/s390.c:8147 +#: config/s390/s390.c:8223 #, c-format msgid "invalid constant vector for output modifier '%c'" msgstr "" -#: config/s390/s390.c:8154 +#: config/s390/s390.c:8230 #, c-format msgid "invalid expression - try using an output modifier" msgstr "" -#: config/s390/s390.c:8157 +#: config/s390/s390.c:8233 #, c-format msgid "invalid expression for output modifier '%c'" msgstr "" -#: config/s390/s390.c:11878 +#: config/s390/s390.c:12011 msgid "vector argument passed to unprototyped function" msgstr "" -#: config/s390/s390.c:16250 +#: config/s390/s390.c:16383 msgid "types differ in signedness" msgstr "" -#: config/s390/s390.c:16260 +#: config/s390/s390.c:16393 msgid "binary operator does not support two vector bool operands" msgstr "" -#: config/s390/s390.c:16263 +#: config/s390/s390.c:16396 msgid "binary operator does not support vector bool operand" msgstr "" -#: config/s390/s390.c:16271 +#: config/s390/s390.c:16404 msgid "" "binary operator does not support mixing vector bool with floating point " "vector operands" @@ -3214,43 +3233,43 @@ msgstr "" msgid "created and used with different endianness" msgstr "" -#: config/sparc/sparc.c:9360 config/sparc/sparc.c:9366 +#: config/sparc/sparc.c:9329 config/sparc/sparc.c:9335 #, c-format msgid "invalid %%Y operand" msgstr "" -#: config/sparc/sparc.c:9453 +#: config/sparc/sparc.c:9422 #, c-format msgid "invalid %%A operand" msgstr "" -#: config/sparc/sparc.c:9473 +#: config/sparc/sparc.c:9442 #, c-format msgid "invalid %%B operand" msgstr "" -#: config/sparc/sparc.c:9553 config/tilegx/tilegx.c:5090 -#: config/tilepro/tilepro.c:4499 +#: config/sparc/sparc.c:9522 config/tilegx/tilegx.c:5088 +#: config/tilepro/tilepro.c:4497 #, c-format msgid "invalid %%C operand" msgstr "" -#: config/sparc/sparc.c:9585 config/tilegx/tilegx.c:5123 +#: config/sparc/sparc.c:9554 config/tilegx/tilegx.c:5121 #, c-format msgid "invalid %%D operand" msgstr "" -#: config/sparc/sparc.c:9604 +#: config/sparc/sparc.c:9573 #, c-format msgid "invalid %%f operand" msgstr "" -#: config/sparc/sparc.c:9616 +#: config/sparc/sparc.c:9585 #, c-format msgid "invalid %%s operand" msgstr "" -#: config/sparc/sparc.c:9661 +#: config/sparc/sparc.c:9630 #, c-format msgid "floating-point constant not a valid immediate operand" msgstr "" @@ -3275,82 +3294,82 @@ msgstr "" msgid "xstormy16_print_operand: unknown code" msgstr "" -#: config/tilegx/tilegx.c:5075 config/tilepro/tilepro.c:4484 +#: config/tilegx/tilegx.c:5073 config/tilepro/tilepro.c:4482 #, c-format msgid "invalid %%c operand" msgstr "" -#: config/tilegx/tilegx.c:5106 +#: config/tilegx/tilegx.c:5104 #, c-format msgid "invalid %%d operand" msgstr "" -#: config/tilegx/tilegx.c:5203 +#: config/tilegx/tilegx.c:5201 #, c-format msgid "invalid %%H specifier" msgstr "" -#: config/tilegx/tilegx.c:5245 config/tilepro/tilepro.c:4513 +#: config/tilegx/tilegx.c:5243 config/tilepro/tilepro.c:4511 #, c-format msgid "invalid %%h operand" msgstr "" -#: config/tilegx/tilegx.c:5257 config/tilepro/tilepro.c:4577 +#: config/tilegx/tilegx.c:5255 config/tilepro/tilepro.c:4575 #, c-format msgid "invalid %%I operand" msgstr "" -#: config/tilegx/tilegx.c:5269 config/tilepro/tilepro.c:4589 +#: config/tilegx/tilegx.c:5267 config/tilepro/tilepro.c:4587 #, c-format msgid "invalid %%i operand" msgstr "" -#: config/tilegx/tilegx.c:5290 config/tilepro/tilepro.c:4610 +#: config/tilegx/tilegx.c:5288 config/tilepro/tilepro.c:4608 #, c-format msgid "invalid %%j operand" msgstr "" -#: config/tilegx/tilegx.c:5321 +#: config/tilegx/tilegx.c:5319 #, c-format msgid "invalid %%%c operand" msgstr "" -#: config/tilegx/tilegx.c:5336 config/tilepro/tilepro.c:4724 +#: config/tilegx/tilegx.c:5334 config/tilepro/tilepro.c:4722 #, c-format msgid "invalid %%N operand" msgstr "" -#: config/tilegx/tilegx.c:5380 +#: config/tilegx/tilegx.c:5378 #, c-format msgid "invalid operand for 'r' specifier" msgstr "" -#: config/tilegx/tilegx.c:5404 config/tilepro/tilepro.c:4804 +#: config/tilegx/tilegx.c:5402 config/tilepro/tilepro.c:4802 #, c-format msgid "unable to print out operand yet; code == %d (%c)" msgstr "" -#: config/tilepro/tilepro.c:4549 +#: config/tilepro/tilepro.c:4547 #, c-format msgid "invalid %%H operand" msgstr "" -#: config/tilepro/tilepro.c:4649 +#: config/tilepro/tilepro.c:4647 #, c-format msgid "invalid %%L operand" msgstr "" -#: config/tilepro/tilepro.c:4709 +#: config/tilepro/tilepro.c:4707 #, c-format msgid "invalid %%M operand" msgstr "" -#: config/tilepro/tilepro.c:4752 config/tilepro/tilepro.c:4759 +#: config/tilepro/tilepro.c:4750 config/tilepro/tilepro.c:4757 #, c-format msgid "invalid %%t operand" msgstr "" -#: config/tilepro/tilepro.c:4779 +#: config/tilepro/tilepro.c:4777 #, c-format msgid "invalid %%r operand" msgstr "" @@ -3363,22 +3382,22 @@ msgstr "" msgid "output_move_single:" msgstr "" -#: config/vax/vax.c:463 +#: config/vax/vax.c:479 #, c-format msgid "symbol used with both base and indexed registers" msgstr "" -#: config/vax/vax.c:472 +#: config/vax/vax.c:488 #, c-format msgid "symbol with offset used in PIC mode" msgstr "" -#: config/vax/vax.c:560 +#: config/vax/vax.c:576 #, c-format msgid "symbol used as immediate operand" msgstr "" -#: config/vax/vax.c:1587 +#: config/vax/vax.c:1667 msgid "illegal operand detected" msgstr "" @@ -3407,20 +3426,20 @@ msgstr "" msgid "bad test" msgstr "" -#: config/xtensa/xtensa.c:2425 +#: config/xtensa/xtensa.c:2440 msgid "invalid mask" msgstr "" -#: config/xtensa/xtensa.c:2477 config/xtensa/xtensa.c:2487 +#: config/xtensa/xtensa.c:2492 config/xtensa/xtensa.c:2502 #, c-format msgid "invalid %%t/%%b value" msgstr "" -#: config/xtensa/xtensa.c:2566 +#: config/xtensa/xtensa.c:2581 msgid "no register in address" msgstr "" -#: config/xtensa/xtensa.c:2574 +#: config/xtensa/xtensa.c:2589 msgid "address offset not a constant" msgstr "" @@ -3441,489 +3460,517 @@ msgstr "" #. ; #. <~~~~~~~~~ declaration ~~~~~~~~~~> #. Use c_parser_require to get an error with a fix-it hint. -#: c/c-parser.c:2456 c/c-parser.c:2575 c/c-parser.c:2589 c/c-parser.c:5700 -#: c/c-parser.c:6331 c/c-parser.c:6781 c/c-parser.c:6960 c/c-parser.c:6994 -#: c/c-parser.c:7251 c/c-parser.c:11044 c/c-parser.c:11079 c/c-parser.c:11110 -#: c/c-parser.c:11157 c/c-parser.c:11338 c/c-parser.c:12137 c/c-parser.c:12207 -#: c/c-parser.c:12250 c/c-parser.c:17706 c/c-parser.c:17730 c/c-parser.c:17748 -#: c/c-parser.c:18174 c/c-parser.c:18218 c/gimple-parser.c:392 -#: c/gimple-parser.c:433 c/gimple-parser.c:442 c/gimple-parser.c:650 -#: c/gimple-parser.c:2190 c/gimple-parser.c:2227 c/gimple-parser.c:2306 -#: c/gimple-parser.c:2333 c/c-parser.c:3268 c/c-parser.c:3455 c/c-parser.c:3488 -#: c/c-parser.c:11331 c/gimple-parser.c:2024 c/gimple-parser.c:2063 -#: cp/parser.c:13745 cp/parser.c:30090 cp/parser.c:30683 +#: c/c-parser.c:2462 c/c-parser.c:2581 c/c-parser.c:2595 c/c-parser.c:5652 +#: c/c-parser.c:6251 c/c-parser.c:6686 c/c-parser.c:6865 c/c-parser.c:6898 +#: c/c-parser.c:7164 c/c-parser.c:10987 c/c-parser.c:11022 c/c-parser.c:11053 +#: c/c-parser.c:11100 c/c-parser.c:11281 c/c-parser.c:12113 c/c-parser.c:12188 +#: c/c-parser.c:12231 c/c-parser.c:17865 c/c-parser.c:17889 c/c-parser.c:17907 +#: c/c-parser.c:18330 c/c-parser.c:18374 c/gimple-parser.c:392 +#: c/gimple-parser.c:433 c/gimple-parser.c:442 c/gimple-parser.c:651 +#: c/gimple-parser.c:2193 c/gimple-parser.c:2230 c/gimple-parser.c:2309 +#: c/gimple-parser.c:2336 c/c-parser.c:3274 c/c-parser.c:3461 c/c-parser.c:3494 +#: c/c-parser.c:11274 c/gimple-parser.c:2027 c/gimple-parser.c:2066 +#: cp/parser.c:14328 cp/parser.c:30947 cp/parser.c:31557 #, gcc-internal-format msgid "expected %<;%>" msgstr "" -#: c/c-parser.c:3038 c/c-parser.c:4013 c/c-parser.c:4208 c/c-parser.c:4273 -#: c/c-parser.c:4331 c/c-parser.c:4693 c/c-parser.c:4714 c/c-parser.c:4723 -#: c/c-parser.c:4774 c/c-parser.c:4783 c/c-parser.c:8584 c/c-parser.c:8650 -#: c/c-parser.c:9149 c/c-parser.c:9171 c/c-parser.c:9205 c/c-parser.c:9314 -#: c/c-parser.c:10097 c/c-parser.c:11445 c/c-parser.c:13661 c/c-parser.c:14304 -#: c/c-parser.c:14363 c/c-parser.c:14418 c/c-parser.c:15684 c/c-parser.c:15782 -#: c/c-parser.c:17023 c/c-parser.c:17790 c/c-parser.c:18182 c/c-parser.c:20987 -#: c/c-parser.c:21065 c/gimple-parser.c:195 c/gimple-parser.c:198 +#: c/c-parser.c:3044 c/c-parser.c:4014 c/c-parser.c:4209 c/c-parser.c:4274 +#: c/c-parser.c:4332 c/c-parser.c:4694 c/c-parser.c:4715 c/c-parser.c:4724 +#: c/c-parser.c:4775 c/c-parser.c:4784 c/c-parser.c:8508 c/c-parser.c:8574 +#: c/c-parser.c:9080 c/c-parser.c:9105 c/c-parser.c:9139 c/c-parser.c:9248 +#: c/c-parser.c:10031 c/c-parser.c:11388 c/c-parser.c:13644 c/c-parser.c:14286 +#: c/c-parser.c:14345 c/c-parser.c:14400 c/c-parser.c:15722 c/c-parser.c:15820 +#: c/c-parser.c:17119 c/c-parser.c:17949 c/c-parser.c:18338 c/c-parser.c:21151 +#: c/c-parser.c:21229 c/gimple-parser.c:195 c/gimple-parser.c:198 #: c/gimple-parser.c:527 c/gimple-parser.c:561 c/gimple-parser.c:566 -#: c/gimple-parser.c:734 c/gimple-parser.c:831 c/gimple-parser.c:1024 -#: c/gimple-parser.c:1050 c/gimple-parser.c:1053 c/gimple-parser.c:1184 -#: c/gimple-parser.c:1311 c/gimple-parser.c:1437 c/gimple-parser.c:1453 -#: c/gimple-parser.c:1469 c/gimple-parser.c:1491 c/gimple-parser.c:1521 -#: c/gimple-parser.c:1547 c/gimple-parser.c:1753 c/gimple-parser.c:1946 -#: c/gimple-parser.c:1966 c/gimple-parser.c:2100 c/gimple-parser.c:2263 -#: c/c-parser.c:7200 cp/parser.c:30731 +#: c/gimple-parser.c:735 c/gimple-parser.c:832 c/gimple-parser.c:1025 +#: c/gimple-parser.c:1051 c/gimple-parser.c:1054 c/gimple-parser.c:1185 +#: c/gimple-parser.c:1312 c/gimple-parser.c:1438 c/gimple-parser.c:1454 +#: c/gimple-parser.c:1470 c/gimple-parser.c:1492 c/gimple-parser.c:1522 +#: c/gimple-parser.c:1548 c/gimple-parser.c:1756 c/gimple-parser.c:1949 +#: c/gimple-parser.c:1969 c/gimple-parser.c:2103 c/gimple-parser.c:2266 +#: c/c-parser.c:7116 cp/parser.c:31605 #, gcc-internal-format msgid "expected %<)%>" msgstr "" -#: c/c-parser.c:4102 c/c-parser.c:4834 c/c-parser.c:4978 c/c-parser.c:5051 -#: c/c-parser.c:5052 c/c-parser.c:5466 c/c-parser.c:5502 c/c-parser.c:7302 -#: c/c-parser.c:9305 c/c-parser.c:10195 c/c-parser.c:10484 c/c-parser.c:13108 -#: c/gimple-parser.c:1730 cp/parser.c:30695 +#: c/c-parser.c:4103 c/c-parser.c:4835 c/c-parser.c:4976 c/c-parser.c:5002 +#: c/c-parser.c:5003 c/c-parser.c:5417 c/c-parser.c:5453 c/c-parser.c:7215 +#: c/c-parser.c:9239 c/c-parser.c:10129 c/c-parser.c:10418 c/c-parser.c:13091 +#: c/gimple-parser.c:1733 cp/parser.c:31569 #, gcc-internal-format msgid "expected %<]%>" msgstr "" -#: c/c-parser.c:4311 +#: c/c-parser.c:4312 msgid "expected %<;%>, %<,%> or %<)%>" msgstr "" #. Look for the two `(' tokens. -#: c/c-parser.c:4743 c/c-parser.c:4748 c/c-parser.c:13644 c/c-parser.c:14393 -#: c/c-parser.c:20348 c/c-parser.c:20795 c/c-parser.c:21008 +#: c/c-parser.c:4744 c/c-parser.c:4749 c/c-parser.c:13627 c/c-parser.c:14375 +#: c/c-parser.c:20512 c/c-parser.c:20959 c/c-parser.c:21172 #: c/gimple-parser.c:180 c/gimple-parser.c:474 c/gimple-parser.c:513 -#: c/gimple-parser.c:545 c/gimple-parser.c:801 c/gimple-parser.c:1018 -#: c/gimple-parser.c:1044 c/gimple-parser.c:1171 c/gimple-parser.c:1306 -#: c/gimple-parser.c:1427 c/gimple-parser.c:1487 c/gimple-parser.c:1505 -#: c/gimple-parser.c:1540 c/gimple-parser.c:1915 c/gimple-parser.c:1926 -#: c/gimple-parser.c:1932 c/gimple-parser.c:2097 c/gimple-parser.c:2260 -#: c/c-parser.c:13466 cp/parser.c:30686 +#: c/gimple-parser.c:545 c/gimple-parser.c:802 c/gimple-parser.c:1019 +#: c/gimple-parser.c:1045 c/gimple-parser.c:1172 c/gimple-parser.c:1307 +#: c/gimple-parser.c:1428 c/gimple-parser.c:1488 c/gimple-parser.c:1506 +#: c/gimple-parser.c:1541 c/gimple-parser.c:1918 c/gimple-parser.c:1929 +#: c/gimple-parser.c:1935 c/gimple-parser.c:2100 c/gimple-parser.c:2263 +#: c/c-parser.c:13449 cp/parser.c:31560 #, gcc-internal-format msgid "expected %<(%>" msgstr "" -#: c/c-parser.c:4974 c/c-parser.c:4976 c/c-parser.c:13036 cp/parser.c:30698 -#: cp/parser.c:34358 +#: c/c-parser.c:4972 c/c-parser.c:4974 c/c-parser.c:13019 cp/parser.c:31572 +#: cp/parser.c:35255 #, gcc-internal-format msgid "expected %<[%>" msgstr "" -#: c/c-parser.c:5636 c/c-parser.c:11674 c/c-parser.c:17983 c/c-parser.c:18800 -#: c/c-parser.c:21843 c/gimple-parser.c:385 c/gimple-parser.c:2266 -#: c/c-parser.c:3256 c/c-parser.c:3478 c/c-parser.c:11226 cp/parser.c:19290 -#: cp/parser.c:30692 +#: c/c-parser.c:5588 c/c-parser.c:11617 c/c-parser.c:18133 c/c-parser.c:18947 +#: c/c-parser.c:22011 c/gimple-parser.c:385 c/gimple-parser.c:2269 +#: c/c-parser.c:3262 c/c-parser.c:3484 c/c-parser.c:11169 cp/parser.c:19889 +#: cp/parser.c:31566 #, gcc-internal-format msgid "expected %<{%>" msgstr "" -#: c/c-parser.c:5914 c/c-parser.c:5923 c/c-parser.c:7735 c/c-parser.c:8786 -#: c/c-parser.c:11438 c/c-parser.c:11834 c/c-parser.c:11898 c/c-parser.c:13090 -#: c/c-parser.c:14005 c/c-parser.c:14221 c/c-parser.c:14711 c/c-parser.c:14812 -#: c/c-parser.c:15436 c/c-parser.c:15563 c/c-parser.c:20210 c/c-parser.c:20852 -#: c/c-parser.c:20911 c/gimple-parser.c:568 c/gimple-parser.c:871 -#: c/gimple-parser.c:2314 c/gimple-parser.c:2341 c/c-parser.c:7207 -#: c/c-parser.c:13569 c/c-parser.c:14817 cp/parser.c:30725 cp/parser.c:32371 -#: cp/parser.c:35149 cp/parser.c:35924 +#: c/c-parser.c:5878 c/c-parser.c:5887 c/c-parser.c:7648 c/c-parser.c:8711 +#: c/c-parser.c:11381 c/c-parser.c:11777 c/c-parser.c:11841 c/c-parser.c:13073 +#: c/c-parser.c:13987 c/c-parser.c:14203 c/c-parser.c:14693 c/c-parser.c:14794 +#: c/c-parser.c:15161 c/c-parser.c:15474 c/c-parser.c:15601 c/c-parser.c:20374 +#: c/c-parser.c:21016 c/c-parser.c:21075 c/gimple-parser.c:568 +#: c/gimple-parser.c:872 c/gimple-parser.c:2317 c/gimple-parser.c:2344 +#: c/c-parser.c:7123 c/c-parser.c:13552 c/c-parser.c:14799 cp/parser.c:31599 +#: cp/parser.c:33245 cp/parser.c:36054 cp/parser.c:36838 #, gcc-internal-format msgid "expected %<:%>" msgstr "" -#: c/c-parser.c:6764 cp/parser.c:30612 +#: c/c-parser.c:6673 cp/parser.c:31486 #, gcc-internal-format msgid "expected %" msgstr "" -#: c/c-parser.c:8548 c/c-parser.c:8737 c/c-parser.c:9195 c/c-parser.c:9238 -#: c/c-parser.c:9376 c/c-parser.c:10087 c/c-parser.c:14398 c/c-parser.c:15519 -#: c/gimple-parser.c:1021 c/gimple-parser.c:1047 c/gimple-parser.c:1175 -#: c/gimple-parser.c:1178 c/gimple-parser.c:1509 c/gimple-parser.c:1515 -#: cp/parser.c:30088 cp/parser.c:30701 +#: c/c-parser.c:8472 c/c-parser.c:8662 c/c-parser.c:9129 c/c-parser.c:9172 +#: c/c-parser.c:9310 c/c-parser.c:10021 c/c-parser.c:14380 c/c-parser.c:15557 +#: c/gimple-parser.c:1022 c/gimple-parser.c:1048 c/gimple-parser.c:1176 +#: c/gimple-parser.c:1179 c/gimple-parser.c:1510 c/gimple-parser.c:1516 +#: cp/parser.c:30945 cp/parser.c:31575 #, gcc-internal-format msgid "expected %<,%>" msgstr "" -#: c/c-parser.c:9095 +#: c/c-parser.c:9026 msgid "expected %<.%>" msgstr "" -#: c/c-parser.c:10897 c/c-parser.c:10929 c/c-parser.c:11169 cp/parser.c:32945 -#: cp/parser.c:33019 +#: c/c-parser.c:10840 c/c-parser.c:10872 c/c-parser.c:11112 cp/parser.c:33819 +#: cp/parser.c:33840 #, gcc-internal-format msgid "expected %<@end%>" msgstr "" -#: c/c-parser.c:11587 c/gimple-parser.c:1345 cp/parser.c:30710 +#: c/c-parser.c:11530 c/gimple-parser.c:1346 cp/parser.c:31584 #, gcc-internal-format msgid "expected %<>%>" msgstr "" -#: c/c-parser.c:14906 c/c-parser.c:15800 cp/parser.c:30734 +#: c/c-parser.c:14888 c/c-parser.c:15838 cp/parser.c:31608 #, gcc-internal-format msgid "expected %<,%> or %<)%>" msgstr "" #. All following cases are statements with LHS. -#: c/c-parser.c:15428 c/c-parser.c:17439 c/c-parser.c:17483 c/c-parser.c:17715 -#: c/c-parser.c:18161 c/c-parser.c:20417 c/c-parser.c:21049 -#: c/gimple-parser.c:725 c/c-parser.c:5525 cp/parser.c:30713 +#: c/c-parser.c:15466 c/c-parser.c:17598 c/c-parser.c:17642 c/c-parser.c:17874 +#: c/c-parser.c:18317 c/c-parser.c:20581 c/c-parser.c:21213 +#: c/gimple-parser.c:726 c/c-parser.c:5476 cp/parser.c:31587 #, gcc-internal-format msgid "expected %<=%>" msgstr "" -#: c/c-parser.c:17731 c/c-parser.c:18031 c/gimple-parser.c:1563 -#: c/gimple-parser.c:1595 c/gimple-parser.c:1605 c/gimple-parser.c:2351 -#: cp/parser.c:30689 cp/parser.c:33164 +#: c/c-parser.c:17890 c/c-parser.c:18181 c/gimple-parser.c:1564 +#: c/gimple-parser.c:1596 c/gimple-parser.c:1606 c/gimple-parser.c:2354 +#: cp/parser.c:31563 cp/parser.c:34029 #, gcc-internal-format msgid "expected %<}%>" msgstr "" -#: c/c-parser.c:18843 c/c-parser.c:18833 cp/parser.c:39781 +#: c/c-parser.c:18990 c/c-parser.c:18980 cp/parser.c:40842 #, gcc-internal-format msgid "expected %<#pragma omp section%> or %<}%>" msgstr "" -#: c/c-typeck.c:8291 +#: c/c-typeck.c:8370 msgid "(anonymous)" msgstr "" -#: c/gimple-parser.c:1334 cp/parser.c:16709 cp/parser.c:30707 +#: c/gimple-parser.c:1335 cp/parser.c:17308 cp/parser.c:31581 #, gcc-internal-format msgid "expected %<<%>" msgstr "" -#: c/gimple-parser.c:2310 c/gimple-parser.c:2337 c/gimple-parser.c:2176 -#: c/gimple-parser.c:2213 +#: c/gimple-parser.c:2313 c/gimple-parser.c:2340 c/gimple-parser.c:2179 +#: c/gimple-parser.c:2216 #, gcc-internal-format msgid "expected label" msgstr "" -#: cp/call.c:3865 +#: cp/call.c:3900 msgid "candidate:" msgstr "" -#: cp/call.c:7209 +#: cp/call.c:7315 msgid " after user-defined conversion:" msgstr "" -#: cp/call.c:7347 cp/pt.c:2029 cp/pt.c:24617 +#: cp/call.c:7453 cp/pt.c:2044 cp/pt.c:25021 msgid "candidate is:" msgid_plural "candidates are:" msgstr[0] "" msgstr[1] "" -#: cp/call.c:11717 +#: cp/call.c:11972 msgid "candidate 1:" msgstr "" -#: cp/call.c:11718 +#: cp/call.c:11973 msgid "candidate 2:" msgstr "" -#: cp/decl.c:3284 +#: cp/decl.c:3370 msgid "jump to label %qD" msgstr "" -#: cp/decl.c:3285 +#: cp/decl.c:3371 msgid "jump to case label" msgstr "" -#: cp/error.c:384 +#: cp/error.c:416 msgid "" msgstr "" -#: cp/error.c:486 +#: cp/error.c:518 msgid "" msgstr "" -#: cp/error.c:488 +#: cp/error.c:520 msgid "" msgstr "" -#: cp/error.c:657 +#: cp/error.c:690 msgid "" msgstr "" #. A lambda's "type" is essentially its signature. -#: cp/error.c:758 +#: cp/error.c:789 msgid "" msgstr "" -#: cp/error.c:770 +#: cp/error.c:801 #, c-format msgid "" msgstr "" -#: cp/error.c:896 +#: cp/error.c:930 msgid "" msgstr "" -#: cp/error.c:1025 +#: cp/error.c:1063 #, c-format msgid "(static initializers for %s)" msgstr "" -#: cp/error.c:1027 +#: cp/error.c:1065 #, c-format msgid "(static destructors for %s)" msgstr "" -#: cp/error.c:1073 +#: cp/error.c:1111 msgid "" msgstr "" -#: cp/error.c:1176 +#: cp/error.c:1217 msgid "vtable for " msgstr "" -#: cp/error.c:1200 +#: cp/error.c:1241 msgid " " msgstr "" -#: cp/error.c:1215 +#: cp/error.c:1256 msgid "{anonymous}" msgstr "" -#: cp/error.c:1217 +#: cp/error.c:1258 msgid "(anonymous namespace)" msgstr "" -#: cp/error.c:1317 +#: cp/error.c:1358 msgid "