aboutsummaryrefslogtreecommitdiff
path: root/libcpp
AgeCommit message (Collapse)AuthorFilesLines
12 daysDaily bump.GCC Administrator1-0/+19
12 daysc++: C++26 Reflection [PR120775]Marek Polacek4-2/+153
This patch implements C++26 Reflection as specified by P2996R13, which allows users to perform magic. This patch also implements related papers: Annotations for Reflection (P3394R4), Splicing a base class subobject (P3293R3), define_static_{string,object,array} (P3491R3), Function Parameter Reflection (P3096R12). (I already implemented consteval blocks back in July.) (We do not yet implement P3795.) We also implemented some CWG issues that had been approved in Kona; e.g., CWG 3101, 3109, 3111, 3115, 3117. All metafunctions are implemented in this patch. The feature needs to be enabled by -std=c++26 -freflection. Some stats: the v1 patch was over 51,200 LOC which were written in ~335 commits. It came with over 400 tests with 11,722 static_asserts. We still had about 50 TODOs and FIXMEs in the code. v2 consists of about 56,000 LOC which were created in 440 commits. We now have 446 tests with 40 TODOs remaining. v3 brought another 77 commits, mostly clean-ups and various bug fixes. I'd like to thank: Jakub Jelinek, whose efforts can only be described as heroic and who never ceases to amaze me even after nearly 15 years of working together, he implemented many difficult metafunctions, annotations, mangling, converted our metafunction dispatch to using gperf, and so on and on; Jonathan Wakely for his libstdc++ patch review and generous & impeccable advice even at odd hours; Dan Katz for his work on the Reflection papers, writing Reflection tests for clang++ (many of which I've stolen^Wused), for his advice, bug reports, and generally cheering me on; Jason Merrill for his guidance, patch review, and, in fact, encouraging me to take on this project in the first place; Michael Levine, Valentyn Yukhymenko, and Alex Yesmanchyk for their nice contributions to Reflection; and Tomasz Kamiński for providing test cases, finding bugs, and answering my C++ questions. PR c++/120775 PR c++/123081 PR c++/122634 gcc/ChangeLog: * attribs.cc (attribute_value_equal): Return false if either attribute is ATTR_UNIQUE_VALUE_P. (merge_attributes): Handle lists with ATTR_UNIQUE_VALUE_P values. * doc/invoke.texi: Document -freflection. * dwarf2out.cc (is_base_type) <case default>: Check TREE_CODE >= LAST_AND_UNUSED_TREE_CODE instead of is_cxx_auto. (gen_type_die_with_usage): For TREE_CODE >= LAST_AND_UNUSED_TREE_CODE trees use use DW_TAG_unspecified_type. * tree-core.h (struct tree_base): Update a comment. * tree.h (ATTR_UNIQUE_VALUE_P): Define. (BINFO_BASE_ACCESSES): Update the comment. gcc/c-family/ChangeLog: * c-attribs.cc (attribute_takes_identifier_p): Return false for C++ annotations. Handle "old parm name". * c-cppbuiltin.cc (c_cpp_builtins): Define __cpp_impl_reflection. * c.opt (freflection): New. gcc/cp/ChangeLog: * Make-lang.in: Add cp/reflect.o. Add a rule for cp/metafns.h. * config-lang.in: Add reflect.cc. * constexpr.cc (constexpr_global_ctx): Add consteval_block and metafns_called members. Initialize them. (cxx_constexpr_quiet_p): New. (cxx_constexpr_manifestly_const_eval): New. (cxx_constexpr_caller): New. (cxx_constexpr_consteval_block): New. (enum value_cat): Move into cp-tree.h. (cxx_eval_constant_expression): Move the declaration into cp-tree.h. No longer static. Handle REFLECT_EXPR. Handle conversion of a reflection to the meta::info type. (cxx_eval_cxa_builtin_fn): Override current_function_decl. (cxx_eval_builtin_function_call): Handle __builtin_is_string_literal. (is_std_allocator): Also check __new_allocator. (is_std_allocator_allocate): No longer static. (cxa_allocate_and_throw_exception): New. (cxx_eval_call_expression): Handle metafunctions. Maybe set metafns_called. (reduced_constant_expression_p): Handle REFLECT_EXPR. (cxx_eval_binary_expression): Use compare_reflections for comparing reflections. (find_immediate_fndecl): Don't walk REFLECT_EXPR_P. (cxx_eval_outermost_constant_expr): Set global_ctx.consteval_block. Detect consteval-only smuggling. (potential_constant_expression_1): Return true for REFLECT_EXPR and SPLICE_EXPR. * constraint.cc (diagnose_trait_expr): Add CPTK_IS_CONSTEVAL_ONLY case. * cp-gimplify.cc (immediate_escalating_function_p): No longer static. (promote_function_to_consteval): Likewise. (cp_gimplify_expr) <case CALL_EXPR>: Detect any surviving consteval-only expressions. <case CP_BUILT_IN_IS_STRING_LITERAL>: Handle. (wipe_consteval_only_r): New. (cp_fold_immediate_r): Detect invalid uses of consteval-only types. Clear consteval-only DECL_EXPRs. (cp_genericize_r): Wipe consteval-only vars from BIND_EXPR_VARS and BLOCK_VARS. * cp-objcp-common.cc (cp_common_init_ts): Mark META_TYPE, SPLICE_SCOPE, SPLICE_EXPR, and REFLECT_EXPR. * cp-trait.def (IS_CONSTEVAL_ONLY): New trait. * cp-tree.def (REFLECT_EXPR, META_TYPE, SPLICE_EXPR, SPLICE_SCOPE): New trees. * cp-tree.h (enum cp_tree_index): Add CPTI_ANNOTATION_IDENTIFIER, CPTI_STD_META, and CPTI_META_INFO_TYPE. (std_meta_node): Define. (meta_info_type_node): Define. (annotation_identifier): Define. (REFLECTION_TYPE_P): Define. (REFLECT_EXPR_P): Define. (REFLECT_EXPR_HANDLE): Define. (enum reflect_kind): New. (REFLECT_EXPR_KIND): Define. (SET_REFLECT_EXPR_KIND): Define. (SPLICE_EXPR_EXPRESSION_P): Define. (SET_SPLICE_EXPR_EXPRESSION_P): Define. (SPLICE_EXPR_MEMBER_ACCESS_P): Define. (SET_SPLICE_EXPR_MEMBER_ACCESS_P): Define. (SPLICE_EXPR_ADDRESS_P): Define. (SET_SPLICE_EXPR_ADDRESS_P): Define. (SPLICE_SCOPE_EXPR): Define. (SPLICE_SCOPE_TYPE_P): Define. (WILDCARD_TYPE_P): Include SPLICE_SCOPE. (COMPONENT_REF_SPLICE_P): Define. (SCALAR_TYPE_P): Include REFLECTION_TYPE_P. (ENUM_BEING_DEFINED_P): Define. (OLD_PARM_DECL_P): Define. (MULTIPLE_NAMES_PARM_P): Define. (cp_preserve_using_decl): Declare. (DEF_OPERATOR, DEF_ASSN_OPERATOR): Include META. (struct ovl_op_info_t): Add meta_name member. (enum cp_built_in_function): Add CP_BUILT_IN_IS_STRING_LITERAL. (build_stub_type): Declare. (current_function_decl_without_access_scope): Declare. (dependent_namespace_p): Declare. (convert_reflect_constant_arg): Declare. (finish_base_specifier): Adjust declaration. (parsing_lambda_declarator): Declare. (fold_builtin_is_string_literal): Declare. (annotation_p): Declare. (finish_class_member_access_expr): Adjust declaration. (immediate_escalating_function_p): Declare. (promote_function_to_consteval): Declare. (is_std_allocator_allocate): Declare. (cxa_allocate_and_throw_exception): Declare. (enum value_cat): Define. (cxx_eval_constant_expression): Declare. (cxx_constexpr_quiet_p): Declare. (cxx_constexpr_manifestly_const_eval): Declare. (cxx_constexpr_caller): Declare. (cxx_constexpr_consteval_block): Declare. (init_reflection): Declare. (metafunction_p): Declare. (direct_base_parent): Declare. (process_metafunction): Declare. (get_reflection): Declare. (get_null_reflection): Declare. (splice): Declare. (check_out_of_consteval_use): Declare. (consteval_only_p): Declare. (compare_reflections): Declare. (valid_splice_type_p): Declare. (valid_splice_scope_p): Declare. (check_splice_expr): Declare. (make_splice_scope): Declare. (dependent_splice_p): Declare. (reflection_mangle_prefix): Declare. (check_consteval_only_fn): Declare. * cvt.cc (convert_to_void): Call check_out_of_consteval_use. * cxx-pretty-print.cc (cxx_pretty_printer::unary_expression): New REFLECT_EXPR case. (cxx_pretty_printer::expression): Likewise. (cxx_pretty_printer::simple_type_specifier): New META_TYPE case. (cxx_pretty_printer::type_id): Likewise. * decl.cc (duplicate_decls): Merge parameter names for Reflection. Maybe set OLD_PARM_DECL_P. (initialize_predefined_identifiers): Add "annotation ". (cxx_init_decl_processing): Add __builtin_is_string_literal. Call init_reflection. (maybe_commonize_var): Do nothing for consteval_only_p. (check_initializer): Default-initialize std::meta::info. (make_rtl_for_nonlocal_decl): For consteval_only_p vars, set DECL_EXTERNAL and return early. (cp_finish_decl): Call check_out_of_consteval_use. Don't go creating a varpool node for consteval_only_p. (get_tuple_size): Check the instantiation instead of the type. (grokfndecl): Call check_consteval_only_fn. (xref_basetypes): Stitch annotations onto BINFO_BASE_ACCESSES. (finish_enum_value_list): Clear ENUM_BEING_DEFINED_P. * decl2.cc (is_late_template_attribute): Handle all annotations as late. (cp_check_const_attributes): Don't handle annotations here. (maybe_make_one_only): Do nothing for consteval_only_p. (mark_needed): Likewise. (min_vis_expr_r): Handle reflections. (prune_vars_needing_no_initialization): Skip consteval_only_p. (no_linkage_error): Return early for metafunctions. (c_parse_final_cleanups): Don't write out consteval_only_p vars. Avoid complaining about metafunctions. * error.cc (dump_type): New cases for CONST_DECL, META_TYPE, and SPLICE_SCOPE. (dump_type_prefix): New cases for META_TYPE and SPLICE_SCOPE. (dump_type_suffix): Likewise. (dump_decl): Dump SPLICE_EXPR. (dump_expr): Dump REFLECT_EXPR and SPLICE_EXPR. * init.cc (build_zero_init_1): Build a null reflection value. (perform_member_init): Call check_out_of_consteval_use. * lex.cc (DEF_OPERATOR, OPERATOR_TRANSITION): Update defines. * mangle.cc (write_type): Mangle META_TYPE. (write_expression): Handle REFLECT_EXPR. (write_reflection): New. (write_template_arg_literal): New REFLECT_EXPR case. (write_template_arg): Handle REFLECT_EXPR. * method.cc (build_stub_type): No longer static. * module.cc (trees_out::type_node): Handle META_TYPE. (trees_in::tree_node): Likewise. * name-lookup.cc (name_lookup::adl_type): std::meta is an associated namespace of std::meta::info. (strip_using_decl): Don't strip when cp_preserve_using_decl. (handle_namespace_attrs): Handle annotations. (do_namespace_alias): Handle SPLICE_EXPR. (lookup_qualified_name): When cp_preserve_using_decl, don't do OVL_FUNCTION. (finish_using_directive): Detect annotations on using directive. * operators.def: Update for META_NAME. * parser.cc: New cp_preserve_using_decl global. (enum required_token): Add RT_CLOSE_SPLICE. (get_required_cpp_ttype): Return CPP_CLOSE_SPLICE for RT_CLOSE_SPLICE. (cp_parser_next_tokens_start_splice_type_spec_p): New. (cp_parser_next_tokens_can_start_splice_scope_spec_p): New. (cp_parser_splice_specifier): New. (cp_parser_splice_type_specifier): New. (cp_parser_splice_expression): New. (cp_parser_splice_scope_specifier): New. (cp_parser_splice_spec_is_nns_p): New. (cp_parser_nth_token_starts_splice_without_nns_p): New. (cp_parser_primary_expression): Handle CPP_OPEN_SPLICE. Give an error for ^^ outside reflection. (cp_parser_unqualified_id): Allow r.~typename [:R:]. (cp_parser_nested_name_specifier_opt): Cope with splice-scope-specifier. (cp_parser_qualifying_entity): Parse splice-scope-specifier. (cp_parser_postfix_expression): Deal with [: :] after a typename. (cp_parser_postfix_dot_deref_expression): Parse & handle splices in a class member access. Pass splice_p to finish_class_member_access_expr. (cp_parser_reflection_name): New. (cp_parser_reflect_expression): New. (cp_parser_unary_expression): Parse reflect-expression. (cp_parser_declaration): Parse splice-scope-specifier. (cp_parser_decomposition_declaration): Detect annotations on structured bindings. (cp_parser_decltype_expr): Parse splice-expression. (cp_parser_template_id): New parsed_templ argument. If it's nonnull, don't parse the template name. Turn an assert into a condition. (cp_parser_type_specifier): Handle typename [: :]. (cp_parser_simple_type_specifier): Parse splice-type-specifier. (cp_parser_enum_specifier): Set ENUM_BEING_DEFINED_P. (cp_parser_namespace_alias_definition): Parse splice-specifier. (cp_parser_using_directive): Likewise. (cp_parser_type_id_1): New bool * parameter to distinguish between types and type aliases. Set it. (cp_parser_type_id): Adjust the call to cp_parser_type_id_1. (cp_parser_template_type_arg): Likewise. (cp_parser_trailing_type_id): Likewise. (cp_parser_base_specifier): Handle annotations. Maybe give an error for splice-scope-specifier. Parse splice-type-specifier. Pass annotations to finish_base_specifier. (cp_parser_annotation): New. (cp_parser_std_attribute_list): Detect mixing annotations and attributes in the same list. (cp_parser_annotation_list): New. (cp_parser_std_attribute_spec): Parse annotations. (cp_parser_skip_balanced_tokens): Also handle CPP_OPEN_SPLICE and CPP_CLOSE_SPLICE. (cp_parser_type_requirement): Parse splice-type-specifier. (cp_parser_lookup_name): Also consider dependent namespaces. Don't call check_accessibility_of_qualified_id for USING_DECLs. (cp_parser_required_error): Handle RT_CLOSE_SPLICE. * pt.cc (current_function_decl_without_access_scope): New. (verify_unstripped_args_1): REFLECT_EXPR_P is OK. (iterative_hash_template_arg): Handle REFLECT_EXPR. (convert_nontype_argument): Maybe give an error for REFLECTION_TYPE_P. (for_each_template_parm_r): Handle SPLICE_SCOPE. (instantiate_class_template): Handle annotations. (tsubst_pack_index): Make static. (tsubst_decl): Handle NAMESPACE_DECL. (tsubst_splice_scope): New. (tsubst_splice_expr): New. (tsubst): Don't return early for NAMESPACE_DECL. New META_TYPE case. Handle a splice-specifier that expanded into a NAMESPACE_DECL. Handle SPLICE_SCOPE, SPLICE_EXPR, and TEMPLATE_ID_EXPR. (tsubst_scope): Also accept NAMESPACE_DECL. (tsubst_qualified_id): Check dependent_namespace_p. (tsubst_lambda_expr): Set LAMBDA_EXPR_CONSTEVAL_BLOCK_P. (tsubst_expr): Allow dependent_splice_p in an assert. Check COMPONENT_REF_SPLICE_P and pass it to finish_class_member_access_expr. <case NAMESPACE_DECL>: Remove. New REFLECT_EXPR and SPLICE_EXPR cases. (unify): Handle META_TYPE. (instantiate_body): Call check_consteval_only_fn. (tsubst_enum): Set ENUM_BEING_DEFINED_P. (dependent_type_p_r): A splice-scope-specifier is dependent. (dependent_namespace_p): New. (value_dependent_expression_p): Handle REFLECT_EXPR. Also handle [meta.reflection.access.context]/8. (type_dependent_expression_p): REFLECT_EXPR_P is not type-dependent. (convert_reflect_constant_arg): New. * search.cc (check_final_overrider): Adjust for CWG 3117. * semantics.cc (finish_base_specifier): Handle annotations. (parsing_lambda_declarator): No longer static. (finish_id_expression_1): Check dependent_namespace_p. (fold_builtin_is_string_literal): New. (trait_expr_value): Handle CPTK_IS_CONSTEVAL_ONLY. (finish_trait_expr): Likewise. * tree.cc (handle_annotation_attribute): New. (builtin_valid_in_constant_expr_p): Return true for CP_BUILT_IN_IS_STRING_LITERAL. (cp_tree_equal): Handle comparing REFLECT_EXPRs. (internal_attributes): Add "annotation ". (annotation_p): New. * typeck.cc (finish_class_member_access_expr): New splice_p argument. Handle dependent splices. Implement splicing a base class subobject. Handle class member access using a splice-expression. (cp_build_binary_op): Handle comparing std::meta::infos. (check_return_expr): Call check_out_of_consteval_use. * metafns.gperf: New file. * metafns.h: New file. * reflect.cc: New file. libcc1/ChangeLog: * libcp1plugin.cc (start_class_def): Update the call to finish_base_specifier. libcpp/ChangeLog: * charset.cc (_cpp_destroy_iconv): Destroy narrow_cset_desc and utf8_cset_desc. (cpp_translate_string): New. (cpp_valid_identifier): New. * include/cpplib.h: Add OPEN_SPLICE, CLOSE_SPLICE, and REFLECT_OP to TTYPE_TABLE. (cpp_translate_string): Declare. (cpp_valid_identifier): Declare. * internal.h (struct cpp_reader): Add reverse_narrow_cset_desc and reverse_utf8_cset_desc fields. * lex.cc (_cpp_lex_direct): Emit CPP_CLOSE_SPLICE, CPP_REFLECT_OP, and CPP_OPEN_SPLICE tokens. libstdc++-v3/ChangeLog: * include/Makefile.am (std_headers): Add ${std_srcdir}/meta. * include/Makefile.in: Regenerate. * include/bits/iterator_concepts.h (std::ranges::__access::__begin): Add constexpr. * include/bits/version.def (reflection): New. * include/bits/version.h: Regenerate. * include/precompiled/stdc++.h: Include <meta> for C++26. * include/std/meta: New file. * include/std/type_traits (std::is_reflection): New trait. (std::is_fundamental): Include is_reflection for C++26 -freflection. (std::is_reflection_v): New variable template. (std::is_consteval_only): New trait. (std::is_consteval_only_v): New variable template. * src/c++23/std.cc.in: Add <meta> exports. * testsuite/20_util/variable_templates_for_traits.cc: Add -freflection as dg-additional-options for C++26. Add std::is_reflection_v test in that case. * testsuite/20_util/is_consteval_only/requirements/explicit_instantiation.cc: New test. * testsuite/20_util/is_consteval_only/requirements/typedefs.cc: New test. * testsuite/20_util/is_consteval_only/value.cc: New test. * testsuite/20_util/is_reflection/requirements/explicit_instantiation.cc: New test. * testsuite/20_util/is_reflection/requirements/typedefs.cc: New test. * testsuite/20_util/is_reflection/value.cc: New test. gcc/testsuite/ChangeLog: * g++.dg/DRs/dr2581-1.C: Add -freflection. * g++.dg/DRs/dr2581-2.C: Likewise. * g++.dg/reflect/access_context1.C: New test. * g++.dg/reflect/access_context2.C: New test. * g++.dg/reflect/access_context3.C: New test. * g++.dg/reflect/adl1.C: New test. * g++.dg/reflect/alignment_of1.C: New test. * g++.dg/reflect/alignment_of2.C: New test. * g++.dg/reflect/annotations1.C: New test. * g++.dg/reflect/annotations2.C: New test. * g++.dg/reflect/annotations3.C: New test. * g++.dg/reflect/annotations4.C: New test. * g++.dg/reflect/annotations5.C: New test. * g++.dg/reflect/annotations6.C: New test. * g++.dg/reflect/annotations7.C: New test. * g++.dg/reflect/annotations8.C: New test. * g++.dg/reflect/anon1.C: New test. * g++.dg/reflect/anon2.C: New test. * g++.dg/reflect/anon3.C: New test. * g++.dg/reflect/bases_of1.C: New test. * g++.dg/reflect/bases_of2.C: New test. * g++.dg/reflect/bases_of3.C: New test. * g++.dg/reflect/bit_size_of1.C: New test. * g++.dg/reflect/bitfield1.C: New test. * g++.dg/reflect/can_substitute1.C: New test. * g++.dg/reflect/class1.C: New test. * g++.dg/reflect/class2.C: New test. * g++.dg/reflect/common_reference1.C: New test. * g++.dg/reflect/common_type1.C: New test. * g++.dg/reflect/compare1.C: New test. * g++.dg/reflect/compare10.C: New test. * g++.dg/reflect/compare2.C: New test. * g++.dg/reflect/compare3.C: New test. * g++.dg/reflect/compare4.C: New test. * g++.dg/reflect/compare5.C: New test. * g++.dg/reflect/compare6.C: New test. * g++.dg/reflect/compare7.C: New test. * g++.dg/reflect/compare8.C: New test. * g++.dg/reflect/compare9.C: New test. * g++.dg/reflect/compat1.C: New test. * g++.dg/reflect/complete1.C: New test. * g++.dg/reflect/constant_of1.C: New test. * g++.dg/reflect/constant_of2.C: New test. * g++.dg/reflect/constant_of3.C: New test. * g++.dg/reflect/constant_of4.C: New test. * g++.dg/reflect/constant_of5.C: New test. * g++.dg/reflect/constant_of6.C: New test. * g++.dg/reflect/constant_of7.C: New test. * g++.dg/reflect/constant_of8.C: New test. * g++.dg/reflect/constant_of9.C: New test. * g++.dg/reflect/crash1.C: New test. * g++.dg/reflect/crash10.C: New test. * g++.dg/reflect/crash11.C: New test. * g++.dg/reflect/crash12.C: New test. * g++.dg/reflect/crash13.C: New test. * g++.dg/reflect/crash14.C: New test. * g++.dg/reflect/crash15.C: New test. * g++.dg/reflect/crash16.C: New test. * g++.dg/reflect/crash17.C: New test. * g++.dg/reflect/crash18.C: New test. * g++.dg/reflect/crash2.C: New test. * g++.dg/reflect/crash3.C: New test. * g++.dg/reflect/crash4.C: New test. * g++.dg/reflect/crash5.C: New test. * g++.dg/reflect/crash6.C: New test. * g++.dg/reflect/crash7.C: New test. * g++.dg/reflect/crash8.C: New test. * g++.dg/reflect/crash9.C: New test. * g++.dg/reflect/data_member_spec1.C: New test. * g++.dg/reflect/data_member_spec2.C: New test. * g++.dg/reflect/data_member_spec3.C: New test. * g++.dg/reflect/data_member_spec4.C: New test. * g++.dg/reflect/dealias1.C: New test. * g++.dg/reflect/dealias2.C: New test. * g++.dg/reflect/dealias3.C: New test. * g++.dg/reflect/define_aggregate1.C: New test. * g++.dg/reflect/define_aggregate2.C: New test. * g++.dg/reflect/define_aggregate3.C: New test. * g++.dg/reflect/define_aggregate4.C: New test. * g++.dg/reflect/define_aggregate5.C: New test. * g++.dg/reflect/define_static_array1.C: New test. * g++.dg/reflect/define_static_array2.C: New test. * g++.dg/reflect/define_static_array3.C: New test. * g++.dg/reflect/define_static_array4.C: New test. * g++.dg/reflect/define_static_object1.C: New test. * g++.dg/reflect/define_static_object2.C: New test. * g++.dg/reflect/define_static_string1.C: New test. * g++.dg/reflect/dep1.C: New test. * g++.dg/reflect/dep10.C: New test. * g++.dg/reflect/dep11.C: New test. * g++.dg/reflect/dep2.C: New test. * g++.dg/reflect/dep3.C: New test. * g++.dg/reflect/dep4.C: New test. * g++.dg/reflect/dep5.C: New test. * g++.dg/reflect/dep6.C: New test. * g++.dg/reflect/dep7.C: New test. * g++.dg/reflect/dep8.C: New test. * g++.dg/reflect/dep9.C: New test. * g++.dg/reflect/diag1.C: New test. * g++.dg/reflect/diag2.C: New test. * g++.dg/reflect/diag3.C: New test. * g++.dg/reflect/diag4.C: New test. * g++.dg/reflect/display_string_of1.C: New test. * g++.dg/reflect/eh1.C: New test. * g++.dg/reflect/eh2.C: New test. * g++.dg/reflect/eh3.C: New test. * g++.dg/reflect/eh4.C: New test. * g++.dg/reflect/eh5.C: New test. * g++.dg/reflect/eh6.C: New test. * g++.dg/reflect/eh7.C: New test. * g++.dg/reflect/eh8.C: New test. * g++.dg/reflect/eh9.C: New test. * g++.dg/reflect/enumerators_of1.C: New test. * g++.dg/reflect/error1.C: New test. * g++.dg/reflect/error10.C: New test. * g++.dg/reflect/error2.C: New test. * g++.dg/reflect/error3.C: New test. * g++.dg/reflect/error4.C: New test. * g++.dg/reflect/error5.C: New test. * g++.dg/reflect/error6.C: New test. * g++.dg/reflect/error8.C: New test. * g++.dg/reflect/error9.C: New test. * g++.dg/reflect/expr1.C: New test. * g++.dg/reflect/expr10.C: New test. * g++.dg/reflect/expr11.C: New test. * g++.dg/reflect/expr12.C: New test. * g++.dg/reflect/expr13.C: New test. * g++.dg/reflect/expr14.C: New test. * g++.dg/reflect/expr2.C: New test. * g++.dg/reflect/expr3.C: New test. * g++.dg/reflect/expr4.C: New test. * g++.dg/reflect/expr5.C: New test. * g++.dg/reflect/expr6.C: New test. * g++.dg/reflect/expr7.C: New test. * g++.dg/reflect/expr8.C: New test. * g++.dg/reflect/expr9.C: New test. * g++.dg/reflect/extract1.C: New test. * g++.dg/reflect/extract2.C: New test. * g++.dg/reflect/extract3.C: New test. * g++.dg/reflect/extract4.C: New test. * g++.dg/reflect/extract5.C: New test. * g++.dg/reflect/extract6.C: New test. * g++.dg/reflect/extract7.C: New test. * g++.dg/reflect/extract8.C: New test. * g++.dg/reflect/extract9.C: New test. * g++.dg/reflect/feat1.C: New test. * g++.dg/reflect/feat2.C: New test. * g++.dg/reflect/has_c_language_linkage1.C: New test. * g++.dg/reflect/has_default_argument1.C: New test. * g++.dg/reflect/has_default_argument2.C: New test. * g++.dg/reflect/has_default_member_initializer1.C: New test. * g++.dg/reflect/has_ellipsis_parameter1.C: New test. * g++.dg/reflect/has_external_linkage1.C: New test. * g++.dg/reflect/has_external_linkage2.C: New test. * g++.dg/reflect/has_identifier1.C: New test. * g++.dg/reflect/has_identifier2.C: New test. * g++.dg/reflect/has_internal_linkage1.C: New test. * g++.dg/reflect/has_internal_linkage2.C: New test. * g++.dg/reflect/has_linkage1.C: New test. * g++.dg/reflect/has_module_linkage1.C: New test. * g++.dg/reflect/has_module_linkage2.C: New test. * g++.dg/reflect/has_parent1.C: New test. * g++.dg/reflect/has_template_arguments1.C: New test. * g++.dg/reflect/has_template_arguments2.C: New test. * g++.dg/reflect/has_template_arguments3.C: New test. * g++.dg/reflect/has_template_arguments4.C: New test. * g++.dg/reflect/identifier_of1.C: New test. * g++.dg/reflect/identifier_of2.C: New test. * g++.dg/reflect/init1.C: New test. * g++.dg/reflect/init10.C: New test. * g++.dg/reflect/init11.C: New test. * g++.dg/reflect/init12.C: New test. * g++.dg/reflect/init13.C: New test. * g++.dg/reflect/init14.C: New test. * g++.dg/reflect/init15.C: New test. * g++.dg/reflect/init16.C: New test. * g++.dg/reflect/init17.C: New test. * g++.dg/reflect/init2.C: New test. * g++.dg/reflect/init3.C: New test. * g++.dg/reflect/init4.C: New test. * g++.dg/reflect/init5.C: New test. * g++.dg/reflect/init6.C: New test. * g++.dg/reflect/init7.C: New test. * g++.dg/reflect/init8.C: New test. * g++.dg/reflect/init9.C: New test. * g++.dg/reflect/is_accessible1.C: New test. * g++.dg/reflect/is_accessible2.C: New test. * g++.dg/reflect/is_alias_template1.C: New test. * g++.dg/reflect/is_assignment1.C: New test. * g++.dg/reflect/is_bit_field1.C: New test. * g++.dg/reflect/is_class_member1.C: New test. * g++.dg/reflect/is_class_template1.C: New test. * g++.dg/reflect/is_complete_type1.C: New test. * g++.dg/reflect/is_complete_type2.C: New test. * g++.dg/reflect/is_concept1.C: New test. * g++.dg/reflect/is_const1.C: New test. * g++.dg/reflect/is_consteval_only1.C: New test. * g++.dg/reflect/is_constructible_type1.C: New test. * g++.dg/reflect/is_constructible_type2.C: New test. * g++.dg/reflect/is_constructor_template1.C: New test. * g++.dg/reflect/is_constuctor1.C: New test. * g++.dg/reflect/is_conversion_function1.C: New test. * g++.dg/reflect/is_conversion_function_template1.C: New test. * g++.dg/reflect/is_copy_assignment1.C: New test. * g++.dg/reflect/is_copy_constructor1.C: New test. * g++.dg/reflect/is_data_member_spec1.C: New test. * g++.dg/reflect/is_default_constructor1.C: New test. * g++.dg/reflect/is_defaulted1.C: New test. * g++.dg/reflect/is_defaulted2.C: New test. * g++.dg/reflect/is_deleted1.C: New test. * g++.dg/reflect/is_deleted2.C: New test. * g++.dg/reflect/is_destructor1.C: New test. * g++.dg/reflect/is_enumerable_type1.C: New test. * g++.dg/reflect/is_enumerator1.C: New test. * g++.dg/reflect/is_explicit1.C: New test. * g++.dg/reflect/is_explicit2.C: New test. * g++.dg/reflect/is_explicit_object_parameter1.C: New test. * g++.dg/reflect/is_final1.C: New test. * g++.dg/reflect/is_function1.C: New test. * g++.dg/reflect/is_function2.C: New test. * g++.dg/reflect/is_function3.C: New test. * g++.dg/reflect/is_function_parameter1.C: New test. * g++.dg/reflect/is_function_parameter2.C: New test. * g++.dg/reflect/is_function_template1.C: New test. * g++.dg/reflect/is_function_template2.C: New test. * g++.dg/reflect/is_function_type1.C: New test. * g++.dg/reflect/is_literal_operator1.C: New test. * g++.dg/reflect/is_literal_operator_template1.C: New test. * g++.dg/reflect/is_lrvalue_reference_qualified1.C: New test. * g++.dg/reflect/is_move_assignment1.C: New test. * g++.dg/reflect/is_move_constructor1.C: New test. * g++.dg/reflect/is_mutable_member1.C: New test. * g++.dg/reflect/is_namespace1.C: New test. * g++.dg/reflect/is_namespace_alias1.C: New test. * g++.dg/reflect/is_namespace_member1.C: New test. * g++.dg/reflect/is_noexcept1.C: New test. * g++.dg/reflect/is_noexcept2.C: New test. * g++.dg/reflect/is_noexcept3.C: New test. * g++.dg/reflect/is_noexcept4.C: New test. * g++.dg/reflect/is_nonstatic_data_member1.C: New test. * g++.dg/reflect/is_object1.C: New test. * g++.dg/reflect/is_object2.C: New test. * g++.dg/reflect/is_operator_function1.C: New test. * g++.dg/reflect/is_operator_function_template1.C: New test. * g++.dg/reflect/is_override1.C: New test. * g++.dg/reflect/is_pure_virtual1.C: New test. * g++.dg/reflect/is_special_member_function1.C: New test. * g++.dg/reflect/is_static_member1.C: New test. * g++.dg/reflect/is_string_literal1.C: New test. * g++.dg/reflect/is_structured_binding1.C: New test. * g++.dg/reflect/is_structured_binding2.C: New test. * g++.dg/reflect/is_template1.C: New test. * g++.dg/reflect/is_template2.C: New test. * g++.dg/reflect/is_type1.C: New test. * g++.dg/reflect/is_type_alias1.C: New test. * g++.dg/reflect/is_type_alias2.C: New test. * g++.dg/reflect/is_type_alias3.C: New test. * g++.dg/reflect/is_user_declared1.C: New test. * g++.dg/reflect/is_user_declared2.C: New test. * g++.dg/reflect/is_user_provided1.C: New test. * g++.dg/reflect/is_user_provided2.C: New test. * g++.dg/reflect/is_variable1.C: New test. * g++.dg/reflect/is_variable_template1.C: New test. * g++.dg/reflect/is_virtual1.C: New test. * g++.dg/reflect/is_volatile1.C: New test. * g++.dg/reflect/lex1.C: New test. * g++.dg/reflect/lex2.C: New test. * g++.dg/reflect/mangle1.C: New test. * g++.dg/reflect/member-visibility1.C: New test. * g++.dg/reflect/member-visibility2.C: New test. * g++.dg/reflect/member1.C: New test. * g++.dg/reflect/member10.C: New test. * g++.dg/reflect/member11.C: New test. * g++.dg/reflect/member12.C: New test. * g++.dg/reflect/member13.C: New test. * g++.dg/reflect/member14.C: New test. * g++.dg/reflect/member15.C: New test. * g++.dg/reflect/member16.C: New test. * g++.dg/reflect/member17.C: New test. * g++.dg/reflect/member18.C: New test. * g++.dg/reflect/member19.C: New test. * g++.dg/reflect/member2.C: New test. * g++.dg/reflect/member20.C: New test. * g++.dg/reflect/member3.C: New test. * g++.dg/reflect/member4.C: New test. * g++.dg/reflect/member5.C: New test. * g++.dg/reflect/member6.C: New test. * g++.dg/reflect/member7.C: New test. * g++.dg/reflect/member8.C: New test. * g++.dg/reflect/member9.C: New test. * g++.dg/reflect/members_of1.C: New test. * g++.dg/reflect/members_of2.C: New test. * g++.dg/reflect/members_of3.C: New test. * g++.dg/reflect/members_of4.C: New test. * g++.dg/reflect/members_of5.C: New test. * g++.dg/reflect/members_of6.C: New test. * g++.dg/reflect/members_of7.C: New test. * g++.dg/reflect/metafn-ptr1.C: New test. * g++.dg/reflect/ns1.C: New test. * g++.dg/reflect/ns2.C: New test. * g++.dg/reflect/ns3.C: New test. * g++.dg/reflect/ns4.C: New test. * g++.dg/reflect/ns5.C: New test. * g++.dg/reflect/ns6.C: New test. * g++.dg/reflect/null1.C: New test. * g++.dg/reflect/null2.C: New test. * g++.dg/reflect/null3.C: New test. * g++.dg/reflect/null4.C: New test. * g++.dg/reflect/null5.C: New test. * g++.dg/reflect/object_of1.C: New test. * g++.dg/reflect/object_of2.C: New test. * g++.dg/reflect/odr1.C: New test. * g++.dg/reflect/offset_of1.C: New test. * g++.dg/reflect/operator_of1.C: New test. * g++.dg/reflect/override1.C: New test. * g++.dg/reflect/p2996-1.C: New test. * g++.dg/reflect/p2996-10.C: New test. * g++.dg/reflect/p2996-11.C: New test. * g++.dg/reflect/p2996-12.C: New test. * g++.dg/reflect/p2996-13.C: New test. * g++.dg/reflect/p2996-14.C: New test. * g++.dg/reflect/p2996-15.C: New test. * g++.dg/reflect/p2996-16.C: New test. * g++.dg/reflect/p2996-17.C: New test. * g++.dg/reflect/p2996-18.C: New test. * g++.dg/reflect/p2996-19.C: New test. * g++.dg/reflect/p2996-2.C: New test. * g++.dg/reflect/p2996-20.C: New test. * g++.dg/reflect/p2996-21.C: New test. * g++.dg/reflect/p2996-3.C: New test. * g++.dg/reflect/p2996-4.C: New test. * g++.dg/reflect/p2996-5.C: New test. * g++.dg/reflect/p2996-6.C: New test. * g++.dg/reflect/p2996-7.C: New test. * g++.dg/reflect/p2996-8.C: New test. * g++.dg/reflect/p2996-9.C: New test. * g++.dg/reflect/p3394-1.C: New test. * g++.dg/reflect/p3491-1.C: New test. * g++.dg/reflect/p3491-2.C: New test. * g++.dg/reflect/p3491-3.C: New test. * g++.dg/reflect/pack-index1.C: New test. * g++.dg/reflect/parameters_of1.C: New test. * g++.dg/reflect/parameters_of2.C: New test. * g++.dg/reflect/parameters_of3.C: New test. * g++.dg/reflect/parameters_of4.C: New test. * g++.dg/reflect/parameters_of5.C: New test. * g++.dg/reflect/parameters_of6.C: New test. * g++.dg/reflect/parent_of1.C: New test. * g++.dg/reflect/parm1.C: New test. * g++.dg/reflect/parm2.C: New test. * g++.dg/reflect/parm3.C: New test. * g++.dg/reflect/parm4.C: New test. * g++.dg/reflect/pr122634-1.C: New test. * g++.dg/reflect/pr122634-2.C: New test. * g++.dg/reflect/qrn1.C: New test. * g++.dg/reflect/qrn2.C: New test. * g++.dg/reflect/range_args.C: New test. * g++.dg/reflect/reflect_constant1.C: New test. * g++.dg/reflect/reflect_constant2.C: New test. * g++.dg/reflect/reflect_constant3.C: New test. * g++.dg/reflect/reflect_constant4.C: New test. * g++.dg/reflect/reflect_constant5.C: New test. * g++.dg/reflect/reflect_constant6.C: New test. * g++.dg/reflect/reflect_constant7.C: New test. * g++.dg/reflect/reflect_constant8.C: New test. * g++.dg/reflect/reflect_constant9.C: New test. * g++.dg/reflect/reflect_constant_array1.C: New test. * g++.dg/reflect/reflect_constant_array2.C: New test. * g++.dg/reflect/reflect_constant_array3.C: New test. * g++.dg/reflect/reflect_constant_array4.C: New test. * g++.dg/reflect/reflect_constant_string1.C: New test. * g++.dg/reflect/reflect_constant_string2.C: New test. * g++.dg/reflect/reflect_function1.C: New test. * g++.dg/reflect/reflect_function2.C: New test. * g++.dg/reflect/reflect_object1.C: New test. * g++.dg/reflect/reflect_object2.C: New test. * g++.dg/reflect/reflect_object3.C: New test. * g++.dg/reflect/reflect_object4.C: New test. * g++.dg/reflect/return_type_of1.C: New test. * g++.dg/reflect/return_type_of2.C: New test. * g++.dg/reflect/serialize1.C: New test. * g++.dg/reflect/serialize2.C: New test. * g++.dg/reflect/size_of1.C: New test. * g++.dg/reflect/source_location_of1.C: New test. * g++.dg/reflect/source_location_of2.C: New test. * g++.dg/reflect/splice1.C: New test. * g++.dg/reflect/splice2.C: New test. * g++.dg/reflect/splice3.C: New test. * g++.dg/reflect/splice4.C: New test. * g++.dg/reflect/splice5.C: New test. * g++.dg/reflect/splice6.C: New test. * g++.dg/reflect/splice7.C: New test. * g++.dg/reflect/splicing-base1.C: New test. * g++.dg/reflect/splicing-base2.C: New test. * g++.dg/reflect/splicing-base3.C: New test. * g++.dg/reflect/splicing-base4.C: New test. * g++.dg/reflect/storage_duration1.C: New test. * g++.dg/reflect/storage_duration2.C: New test. * g++.dg/reflect/storage_duration3.C: New test. * g++.dg/reflect/subobjects_of1.C: New test. * g++.dg/reflect/substitute1.C: New test. * g++.dg/reflect/substitute2.C: New test. * g++.dg/reflect/symbol_of1.C: New test. * g++.dg/reflect/symbol_of2.C: New test. * g++.dg/reflect/template_arguments_of1.C: New test. * g++.dg/reflect/template_arguments_of2.C: New test. * g++.dg/reflect/template_arguments_of3.C: New test. * g++.dg/reflect/template_of1.C: New test. * g++.dg/reflect/template_of2.C: New test. * g++.dg/reflect/template_of3.C: New test. * g++.dg/reflect/tuple1.C: New test. * g++.dg/reflect/tuple2.C: New test. * g++.dg/reflect/type1.C: New test. * g++.dg/reflect/type10.C: New test. * g++.dg/reflect/type2.C: New test. * g++.dg/reflect/type3.C: New test. * g++.dg/reflect/type4.C: New test. * g++.dg/reflect/type5.C: New test. * g++.dg/reflect/type6.C: New test. * g++.dg/reflect/type7.C: New test. * g++.dg/reflect/type8.C: New test. * g++.dg/reflect/type9.C: New test. * g++.dg/reflect/type_of1.C: New test. * g++.dg/reflect/type_of2.C: New test. * g++.dg/reflect/type_rels1.C: New test. * g++.dg/reflect/type_trait1.C: New test. * g++.dg/reflect/type_trait10.C: New test. * g++.dg/reflect/type_trait11.C: New test. * g++.dg/reflect/type_trait12.C: New test. * g++.dg/reflect/type_trait13.C: New test. * g++.dg/reflect/type_trait2.C: New test. * g++.dg/reflect/type_trait3.C: New test. * g++.dg/reflect/type_trait4.C: New test. * g++.dg/reflect/type_trait5.C: New test. * g++.dg/reflect/type_trait6.C: New test. * g++.dg/reflect/type_trait8.C: New test. * g++.dg/reflect/type_trait9.C: New test. * g++.dg/reflect/u8display_string_of1.C: New test. * g++.dg/reflect/u8identifier_of1.C: New test. * g++.dg/reflect/u8symbol_of1.C: New test. * g++.dg/reflect/underlying_type1.C: New test. * g++.dg/reflect/using1.C: New test. * g++.dg/reflect/value_or_object1.C: New test. * g++.dg/reflect/variable_of1.C: New test. * g++.dg/reflect/variable_of2.C: New test. * g++.dg/reflect/variable_of3.C: New test. * g++.dg/reflect/variant1.C: New test. * g++.dg/reflect/variant2.C: New test. * g++.dg/reflect/vector1.C: New test. * g++.dg/reflect/visibility1.C: New test. Co-authored-by: Jakub Jelinek <jakub@redhat.com> Signed-off-by: Valentyn Yukhymenko <vyuhimenko@bloomberg.net> Signed-off-by: Alex Yesmanchyk <ayesmanchyk@bloomberg.net> Signed-off-by: Michael Levine <mlevine55@bloomberg.net> Reviewed-by: Jason Merrill <jason@redhat.com>
2026-01-10Daily bump.GCC Administrator1-0/+5
2026-01-09bugzilla: remove `gcc-bugs@` mailing list addressBen Boeckel2-12/+12
Bugzilla is preferred today. Use a URL that gives context about gathering information prior to actually filing a bug at Bugzilla. ChangeLog: * config-ml.in: Replace gcc-bugs@ with bug reporting link. * symlink-tree: Replace gcc-bugs@ with bug reporting link. fixincludes/ChangeLog: * README: Replace gcc-bugs@ with bug reporting link. gcc/testsuite/ChangeLog: * lib/file-format.exp: Replace gcc-bugs@ with bug reporting link. libcpp/ChangeLog: * configure: Regenerate. * configure.ac: Replace gcc-bugs@ with bug reporting link. libdecnumber/ChangeLog: * configure: Regenerate. * configure.ac: Replace gcc-bugs@ with bug reporting link.
2026-01-06Daily bump.GCC Administrator1-0/+4
2026-01-05Update cpplib ka.poJoseph Myers1-241/+164
* ka.po: Update.
2026-01-02Update copyright years.Jakub Jelinek27-29/+29
2026-01-01Update Copyright year in ChangeLog filesJakub Jelinek1-1/+1
2025 -> 2026
2025-12-11Daily bump.GCC Administrator1-0/+9
2025-12-10c++/modules: #include <vector> -> import <bits/stdc++.h>Jason Merrill2-74/+108
Since the standard library doesn't preclude an #include of a standard library header from bringing in declarations from other headers, we can translate an #include of any of the importable headers as an import of <bits/stdc++.h>. To reduce the amount of C++ standard knowledge encoded in libcpp, I extend the translate_include callback to allow it to suggest an alternate header to try translating. It's a bit awkward to bounce back and forth, but this seems like the right division of responsibilities. libcpp/ChangeLog: * include/cpplib.h (struct cpp_callbacks): Replace 'path' parameter with file, angle_brackets, and alternate name. (cpp_get_name): Declare. * files.cc (cpp_get_name): New. (_cpp_stack_include, _cpp_post_stack_file, _cpp_stack_file) (_cpp_stack_translated_file): Refactor, try alternate file. gcc/cp/ChangeLog: * module.cc (maybe_translate_include): Suggest <bits/stdc++.h> as an alternate for importable standard library headers. (importable_headers, is_importable_header): New. gcc/ChangeLog: * doc/invoke.texi (C++ Modules): Remove standard library header units from missing pieces, mention importable header redirection. gcc/testsuite/ChangeLog: * g++.dg/modules/compile-std1.C: Test <vector> translation.
2025-12-08Daily bump.GCC Administrator1-0/+10
2025-12-07libcpp: adjust _cpp_file accessorsJason Merrill3-23/+14
Back in r78875 mrs added cpp_get_path/dir accessors for _cpp_file in order to interface with the darwin framework system. But now I notice that the latter duplicates the better-named _cpp_get_file_dir, and I'm inclined to rename the former to match. Perhaps we should drop the initial underscore since these are no longer internal interfaces; OTOH, _cpp_hashnode_value and _cpp_backup_tokens still have the initial underscore in cpplib.h. libcpp/ChangeLog: * include/cpplib.h (cpp_get_path, cpp_get_dir): Remove. (_cpp_get_file_path, _cpp_get_file_name, _cpp_get_file_stat) (_cpp_get_file_dir): Move prototypes from... * internal.h: ...here. * files.cc (_cpp_get_file_path): Rename from... (cpp_get_path): ...this. (cpp_get_dir): Remove. gcc/ChangeLog: * config/darwin-c.cc (find_subframework_header): Use _cpp_get_file_*.
2025-11-11Daily bump.GCC Administrator1-0/+24
2025-11-10c++, libcpp: Implement CWG3053Jakub Jelinek1-3/+8
The following patch implements CWG3053 approved in Kona, where it is now valid not just to #define likely(a) or #define unlikely(a, b, c) but also to #undef likely or #undef unlikely. 2025-11-10 Jakub Jelinek <jakub@redhat.com> libcpp/ * directives.cc: Implement CWG3053. (do_undef): Don't pedwarn or warn about #undef likely or #undef unlikely. gcc/testsuite/ * g++.dg/warn/Wkeyword-macro-4.C: Don't diagnose for #undef likely or #undef unlikely. * g++.dg/warn/Wkeyword-macro-5.C: Likewise. * g++.dg/warn/Wkeyword-macro-9.C: Likewise. * g++.dg/warn/Wkeyword-macro-8.C: Likewise. * g++.dg/warn/Wkeyword-macro-10.C: Likewise.
2025-11-09libcpp: Improve locations for macros defined prior to PCH include [PR105608]Lewis Hyatt3-22/+115
It is permissible to define macros prior to including a PCH, as long as these definitions are disjoint from or identical to the macros in the PCH. The PCH loading process replaces all libcpp data structures with those from the PCH, so it is necessary to remember the extra macros separately and then restore them after loading the PCH, which all is handled by cpp_save_state() and cpp_read_state() in libcpp/pch.cc. The restoration process consists of pushing a buffer containing the macro definition and then lexing it from there, similar to how a command-line -D option is processed. The current implementation does not attempt to set up the line_map for this process, and so the locations assigned to the macros are often not meaningful. (Similar to what happened in the past with lexing the tokens out of a _Pragma string, lexing out of a buffer rather than a file produces "sorta" reasonable locations that are often close enough, but not reliably correct.) Fix that up by remembering enough additional information (more or less, an expanded_location for each macro definition) to produce a reasonable location for the newly restored macros. One issue that came up is the treatment of command-line-defined macros. From the perspective of the generic line_map data structures, the command-line location is not distinguishable from other locations; it's just an ordinary location created by the front ends with a fake file name by convention. (At the moment, it is always the string `<command-line>', subject to translation.) Since libcpp needs to assign macros to that location, it needs to know what location to use, so I added a new member line_maps::cmdline_location for the front ends to set, similar to how line_maps::builtin_location is handled. This revealed a small issue, in c-opts.cc we have: /* All command line defines must have the same location. */ cpp_force_token_locations (parse_in, line_table->highest_line); But contrary to the comment, all command line defines don't actually end up with the same location anymore. This is because libcpp/lex.cc has been expanded (r6-4873) to include range information on the returned locations. That logic has never been respecting the request of cpp_force_token_locations. I believe this was not intentional, and so I have corrected that here. Prior to this patch, the range logic has been leading to command-line macros all having similar locations in the same line map (or ad-hoc locations based from there for sufficiently long tokens); with this change, they all have exactly the same location and that location is recorded in line_maps::cmdline_location. With that change, then it works fine for pch.cc to restore macros whether they came from the command-line or from the main file. gcc/c-family/ChangeLog: PR preprocessor/105608 * c-opts.cc (c_finish_options): Set new member line_table->cmdline_location. * c-pch.cc (c_common_read_pch): Adapt linemap usage to changes in libcpp pch.cc; it is now possible that the linemap is in a different file after returning from cpp_read_state(). libcpp/ChangeLog: PR preprocessor/105608 * include/line-map.h: Add new member CMDLINE_LOCATION. * lex.cc (get_location_for_byte_range_in_cur_line): Do not expand the token location to include range information if token location override was requested. (warn_about_normalization): Likewise. (_cpp_lex_direct): Likewise. * pch.cc (struct saved_macro): New local struct. (struct save_macro_data): Change DEFNS vector to hold saved_macro rather than uchar*. (save_macros): Adapt to remember the location information for each saved macro in addition to the definition. (cpp_prepare_state): Likewise. (cpp_read_state): Use the saved location information to generate proper locations for the restored macros. gcc/testsuite/ChangeLog: PR preprocessor/105608 * g++.dg/pch/line-map-3.C: Remove xfails. * g++.dg/pch/line-map-4.C: New test. * g++.dg/pch/line-map-4.Hs: New test.
2025-10-14Daily bump.GCC Administrator1-0/+5
2025-10-14libcpp: decode original directory strings for traditional CPPPierre Marie de Rodat1-4/+27
In traditional CPP mode (-save-temps, -no-integrated-cpp, etc.), the compilation directory is conveyed to cc1 using a line such as: # <line> "/path/name//" This string literal can contain escape sequences, for instance, if the original source file was compiled in "/tmp/a\b", then this line will be: # <line> "/tmp/a\\b//" So reading the compilation directory must decode escape sequences. This last part is currently missing and this patch implements it. libcpp/ * init.cc (read_original_directory): Attempt to decode escape sequences with cpp_interpret_string_notranslate.
2025-10-09Daily bump.GCC Administrator1-0/+13
2025-10-08Update to Unicode 17.0.0Jakub Jelinek5-18542/+18817
The following patch updates GCC from Unicode 16.0.0 to 17.0.0. I've followed what the README says and updated also one script from glibc, but that needed another Unicode file - HangulSyllableType.txt - around as well, so I'm adding it. I've added one new test to named-universal-char-escape-1.c for randomly chosen character from new CJK block. Note, Unicode 17.0.0 authors forgot to adjust the 4-8 table, I've filed bugreports about that but the UnicodeData.txt changes for the range ends and the new range seems to match e.g. what is in the glyph tables, so the patch follows UnicodeData.txt and not 4-8 table here. Another thing was that makeuname2c.cc didn't handle correctly when the size of the generated string table modulo 77 was 76 or 77, in which case it forgot to emit a semicolon after the string literal and so failed to compile. And as can be seen in the emoji-data.txt diff, some properties like Extended_Pictographic have been removed from certain characters, e.g. from the Mahjong cards characters except U+1F004, and one libstdc++ test was testing that property exactly on U+1F000. Dunno why that was changed, but U+1F004 is the only colored one among tons of black and white ones. 2025-10-08 Jakub Jelinek <jakub@redhat.com> contrib/ * unicode/README: Add HangulSyllableType.txt file to the list as newest utf8_gen.py from glibc now needs it. Adjust git commit hash and change unicode 16 version to 17. * unicode/from_glibc/utf8_gen.py: Updated from glibc. * unicode/DerivedCoreProperties.txt: Updated from Unicode 17.0.0. * unicode/emoji-data.txt: Likewise. * unicode/PropList.txt: Likewise. * unicode/GraphemeBreakProperty.txt: Likewise. * unicode/DerivedNormalizationProps.txt: Likewise. * unicode/NameAliases.txt: Likewise. * unicode/UnicodeData.txt: Likewise. * unicode/EastAsianWidth.txt: Likewise. * unicode/DerivedGeneralCategory.txt: Likewise. * unicode/HangulSyllableType.txt: New file. gcc/testsuite/ * c-c++-common/cpp/named-universal-char-escape-1.c: Add test for \N{CJK UNIFIED IDEOGRAPH-3340E}. libcpp/ * makeucnid.cc (write_copyright): Adjust copyright year. * makeuname2c.cc (generated_ranges): Adjust end points for a couple of ranges based on UnicodeData.txt Last changes and add a whole new CJK UNIFIED IDEOGRAPH- entry. None of these changes are in the 4-8 table, but clearly it has just been forgotten. (write_copyright): Adjust copyright year. (write_dict): Fix up condition when to print semicolon. * generated_cpp_wcwidth.h: Regenerate. * ucnid.h: Regenerate. * uname2c.h: Regenerate. libstdc++-v3/ * include/bits/unicode-data.h: Regenerate. * testsuite/ext/unicode/properties.cc: Test __is_extended_pictographic on U+1F004 rather than U+1F000.
2025-09-24Daily bump.GCC Administrator1-0/+6
2025-09-23sarif output: add descriptions to fix-it hints (§3.55.2) [PR121986]David Malcolm1-0/+2
SARIF "fix" objects SHOULD have a "description" property (§3.55.2) that describes the proposed fix, but currently GCC's SARIF output doesn't support this, and we don't capture this anywhere internally as we build fix-it hints in the compiler. Currently we can have zero or more instances of fixit_hint associated with a diagnostic, each representing an edit of a range of the source code. Ideally we would have an internal API that allowed for associating multiple fixes with a diagnostic, each with a description worded in terms of the source language (e.g. "Fix 'colour' mispelling of field 'color'"), and each consisting of multiple edited ranges. For now, this patch extends the sarif output sink so that it autogenerates descriptions of fix-it hints for simple cases of insertion, deletion, and replacement of a single range (e.g. "Replace 'colour' with 'color'"). gcc/ChangeLog: PR diagnostics/121986 * diagnostics/sarif-sink.cc: Include "intl.h". (sarif_builder::make_message_describing_fix_it_hint): New. (sarif_builder::make_fix_object): Attempt to auto-generate a description for fix-it hints. gcc/testsuite/ChangeLog: PR diagnostics/121986 * gcc.dg/sarif-output/extra-semicolon.c: New test. * gcc.dg/sarif-output/extra-semicolon.py: New test. * gcc.dg/sarif-output/missing-semicolon.py: Verify the description of the insertion fix-it hint. * libgdiagnostics.dg/test-fix-it-hint-c.py: Verify the description of the replacement fix-it hint. libcpp/ChangeLog: PR diagnostics/121986 * include/rich-location.h (fixit_hint::deletion_p): New accessor. (fixit_hint::replacement_p): New accessor. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2025-09-19Daily bump.GCC Administrator1-0/+7
2025-09-18diagnostics/libcpp: convert enum location_aspect to enum classDavid Malcolm2-10/+10
Modernization; no functional change intended. gcc/ChangeLog: * diagnostics/paths-output.cc: Update for conversion of location_aspect to enum class. * diagnostics/source-printing.cc: Likewise. * input.cc: Likewise. * input.h: Likewise. libcpp/ChangeLog: * include/line-map.h (enum location_aspect): Convert to... (enum class location_aspect): ...this. * line-map.cc: Update for conversion of location_aspect to enum class. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2025-09-02Daily bump.GCC Administrator1-0/+6
2025-09-01c: Implement C2Y N3457 - The __COUNTER__ predefined macroJakub Jelinek1-0/+3
The following patch implements the https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3457.htm paper without the first 3 lines in Recommended practice. Seems GCC behavior already matches the expected behavior except for diagnostics of more than 2147483648 __COUNTER__ expansions, so the patch adds a diagnostic for that (but not testcase because #define A __COUNTER__ __COUNTER__ __COUNTER__ __COUNTER__ __COUNTER__ __COUNTER__ __COUNTER__ __COUNTER__ #define B A A A A A A A A #define C B B B B B B B B #define D C C C C C C C C #define E D D D D D D D D #define F E E E E E E E E #define G F F F F F F F F #define H G G G G G G G G #define I H H H H H H H H #define J I I I I I I I I J J J J __COUNTER__ just takes too long to preprocess). Plus I've included all the snippets from the paper into one testcase. 2025-09-01 Jakub Jelinek <jakub@redhat.com> * macro.cc: Implement C2Y N3457 - The __COUNTER__ predefined macro. (_cpp_builtin_macro_text): Diagnose if __COUNTER__ reaches 2147483648 value. * gcc.dg/cpp/c2y-counter-1.c: New test.
2025-08-16Daily bump.GCC Administrator1-0/+22
2025-08-15c++: Warn on #undef/#define of remaining cpp.predefined macros [PR120778]Jakub Jelinek4-5/+59
We already warn on #undef or pedwarn on #define (but not on #define after #undef) of some builtin macros mentioned in cpp.predefined. The C++26 P2843R3 paper changes it from (compile time) undefined behavior to ill-formed. The following patch arranges for warning (for #undef) and pedwarn (on #define) for the remaining cpp.predefined macros. __cpp_* feature test macros only for C++20 which added some of them to cpp.predefined, in earlier C++ versions it was just an extension and for pedantic diagnostic I think we don't need to diagnose anything, __STDCPP_* and __cplusplus macros for all C++ versions where they appeared. Like the earlier posted -Wkeyword-macro diagnostics (which is done regardless whether the identifier is defined as a macro or not, obviously most likely none of the keywords are defined as macros initially), this one also warns on #undef when a macro isn't defined or later #define after #undef. 2025-08-15 Jakub Jelinek <jakub@redhat.com> PR preprocessor/120778 PR target/121520 gcc/c-family/ * c-cppbuiltin.cc (c_cpp_builtins): Implement C++26 DR 2581. Add cpp_define_warn lambda and use it as well as cpp_warn where needed. In the if (c_dialect_cxx ()) block with __cpp_* predefinitions add cpp_define lambda. Formatting fixes. gcc/c/ * c-decl.cc (c_init_decl_processing): Use cpp_warn instead of cpp_lookup and NODE_WARN bit setting. gcc/cp/ * lex.cc (cxx_init): Remove warn_on lambda. Use cpp_warn instead of cpp_lookup and NODE_WARN bit setting or warn_on. gcc/testsuite/ * g++.dg/DRs/dr2581-1.C: New test. * g++.dg/DRs/dr2581-2.C: New test. * c-c++-common/cpp/pr92296-2.c: Expect warnings also on defining special macros after undefining them. libcpp/ * include/cpplib.h (struct cpp_options): Add suppress_builtin_macro_warnings member. (cpp_warn): New inline functions. * init.cc (cpp_create_reader): Clear suppress_builtin_macro_warnings. (cpp_init_builtins): Call cpp_warn on __cplusplus, __STDC__, __STDC_VERSION__, __STDC_MB_MIGHT_NEQ_WC__ and __STDCPP_STRICT_POINTER_SAFETY__ when appropriate. * directives.cc (do_undef): Warn on undefining NODE_WARN macros if not cpp_keyword_p. Don't emit any NODE_WARN related diagnostics if CPP_OPTION (pfile, suppress_builtin_macro_warnings). (cpp_define, _cpp_define_builtin, cpp_undef): Temporarily set CPP_OPTION (pfile, suppress_builtin_macro_warnings) around run_directive calls. * macro.cc (_cpp_create_definition): Warn on defining NODE_WARN macros if they weren't previously defined and not cpp_keyword_p. Ignore NODE_WARN for diagnostics if CPP_OPTION (pfile, suppress_builtin_macro_warnings).
2025-08-11Daily bump.GCC Administrator1-0/+4
2025-08-10Regenerate configure filesH.J. Lu1-0/+2
Regenerate configure files after commit 8a3ad190c14789cde0b03142760b14b5675e8b39 Author: Ijaz, Abdul B <abdul.b.ijaz@intel.com> Date: Sun Aug 10 08:33:30 2025 -0600 config: Handle dash in library name for AC_LIB_LINKAGEFLAGS_BODY gcc/ * configure: Regenerated. libcpp/ * configure: Regenerated. libgcobol/ * configure: Regenerated. libstdc++-v3/ * configure: Regenerated. Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
2025-08-08Daily bump.GCC Administrator1-0/+12
2025-08-07c++, c: Introduce -Wkeyword-macro warning/pedwarn - part of C++26 P2843R3 ↵Jakub Jelinek3-8/+63
[PR120778] The following patch introduces a -Wkeyword-macro warning that clang has since 2014 to implement part of C++26 P2843R3 Preprocessing is never undefined paper. The relevant change in the paper is moving [macro.names]/2 paragraph to https://eel.is/c++draft/cpp.replace.general#9 : "A translation unit shall not #define or #undef names lexically identical to keywords, to the identifiers listed in Table 4, or to the attribute-tokens described in [dcl.attr], except that the names likely and unlikely may be defined as function-like macros." Now, my understanding of the paper is that in [macro.names] and surrounding sections the word shall bears different meaning from [cpp.replace.general], where only the latter location implies ill-formed, diagnostic required. The warning in clang when introduced diagnosed all #define/#undef directives on keywords, but shortly after introduction has been changed not to diagnose #undef at all (with "#undef a keyword is generally harmless but used often in configuration scripts" message) and later on even the #define part tweaked - not warn about say #define inline (or const, extern, static), or #define keyword keyword or #define keyword __keyword or #define keyword __keyword__ Later on the warning has been moved to be only pedantic diagnostic unless requested by users. Clearly some code in the wild does e.g. #define private public and similar games, or e.g. Linux kernel (sure, C) does #define inline __inline__ __attribute__((__always_inline__)) etc. Now, I believe at least with the current C++26 wording such exceptions aren't allowed (unless it is changed to IFNDR). But given that this is just pedantic stuff, the following patch makes the warning off by default for C and C++ before C++26 and even for C++26 it enables it by default only if -pedantic/-pedantic-errors (in that case it pedwarns, otherwise it warns). And it diagnoses both #define and #undef without exceptions. From what I can see, all the current NODE_WARN cases are macros starting with __ with one exception (_Pragma). As the NODE_* flags seem to be a limited resource, I chose to just use NODE_WARN as well and differentiate on the node names (if they don't start with __ or _P, they are considered to be -Wkeyword-macro registered ones, otherwise old NODE_WARN cases, typically builtin macros or __STDC* macros). 2025-08-07 Jakub Jelinek <jakub@redhat.com> PR preprocessor/120778 gcc/ * doc/invoke.texi (Wkeyword-macro): Document. gcc/c-family/ * c.opt (Wkeyword-macro): New option. * c.opt.urls: Regenerate. * c-common.h (cxx_dialect): Comment formatting fix. * c-opts.cc (c_common_post_options): Default to -Wkeyword-macro for C++26 if pedantic. gcc/c/ * c-decl.cc (c_init_decl_processing): Mark cpp nodes corresponding to keywords as NODE_WARN if warn_keyword_macro. gcc/cp/ * lex.cc (cxx_init): Mark cpp nodes corresponding to keywords, identifiers with special meaning and standard attribute identifiers as NODE_WARN if warn_keyword_macro. gcc/testsuite/ * gcc.dg/Wkeyword-macro-1.c: New test. * gcc.dg/Wkeyword-macro-2.c: New test. * gcc.dg/Wkeyword-macro-3.c: New test. * gcc.dg/Wkeyword-macro-4.c: New test. * gcc.dg/Wkeyword-macro-5.c: New test. * gcc.dg/Wkeyword-macro-6.c: New test. * gcc.dg/Wkeyword-macro-7.c: New test. * gcc.dg/Wkeyword-macro-8.c: New test. * gcc.dg/Wkeyword-macro-9.c: New test. * g++.dg/warn/Wkeyword-macro-1.C: New test. * g++.dg/warn/Wkeyword-macro-2.C: New test. * g++.dg/warn/Wkeyword-macro-3.C: New test. * g++.dg/warn/Wkeyword-macro-4.C: New test. * g++.dg/warn/Wkeyword-macro-5.C: New test. * g++.dg/warn/Wkeyword-macro-6.C: New test. * g++.dg/warn/Wkeyword-macro-7.C: New test. * g++.dg/warn/Wkeyword-macro-8.C: New test. * g++.dg/warn/Wkeyword-macro-9.C: New test. * g++.dg/warn/Wkeyword-macro-10.C: New test. * g++.dg/opt/pr82577.C: Don't #define register to nothing for C++17 and later. Instead define reg macro to nothing for C++17 and later or to register and use it instead of register. * g++.dg/modules/atom-preamble-3.C: Add -Wno-keyword-macro to dg-additional-options. * g++.dg/template/sfinae17.C (static_assert): Rename macro to ... (my_static_assert): ... this. (main): Use my_static_assert instead of static_assert. libcpp/ * include/cpplib.h (struct cpp_options): Add cpp_warn_keyword_macro. (enum cpp_warning_reason): Add CPP_W_KEYWORD_MACRO enumerator. (cpp_keyword_p): New inline function. * directives.cc (do_undef): Support -Wkeyword-macro diagnostics. * macro.cc (warn_of_redefinition): Ignore NODE_WARN flag on nodes registered for -Wkeyword-macro. (_cpp_create_definition): Support -Wkeyword-macro diagnostics. Formatting fixes.
2025-08-06Daily bump.GCC Administrator1-0/+6
2025-08-05libcpp: Add testcase for CWG2579 [PR120778]Jakub Jelinek1-1/+1
Another easy part from the paper. Part of the CWG2579 has been already done in an earlier paper (with test commits by Marek) and the remaining part is implemented correctly, we diagnose as error when token pasting doesn't form a valid token. Except that message pasting """" and """" does not give a valid preprocessing token looked weird and so I've updated the message to use %< and %> instead of \" quoting. 2025-08-05 Jakub Jelinek <jakub@redhat.com> PR preprocessor/120778 * macro.cc (paste_tokens): Use %< and %> instead of \" in diagnostics around %.*s. * g++.dg/DRs/dr2579.C: New test. * c-c++-common/cpp/va-opt-6.c: Expect ' rather than \" around tokens in incorrect pasting diagnostics. * gcc.dg/c23-attr-syntax-6.c: Likewise. * gcc.dg/cpp/paste12.c: Likewise. * gcc.dg/cpp/paste12-2.c: Likewise. * gcc.dg/cpp/paste14.c: Likewise. * gcc.dg/cpp/paste14-2.c: Likewise.
2025-08-05Daily bump.GCC Administrator1-0/+6
2025-08-04libcpp: Use pedwarn instead of warning for CWG2578 diagnostics [PR120778]Jakub Jelinek1-1/+4
This is another case which changed from compile time undefined behavior to ill-formed, diagnostic required. Now, we warn on this, so pedantically that is good enough, maybe all we need is a testcase, but the following patch changes it to a pedwarn for C++26. 2025-08-04 Jakub Jelinek <jakub@redhat.com> PR preprocessor/120778 * macro.cc (stringify_arg): For C++26 emit a pedarn instead of warning for \ at the end of stringification. * g++.dg/DRs/dr2578.C: New test.
2025-08-04Daily bump.GCC Administrator1-0/+7
2025-08-03libcpp: Fix up cpp_maybe_module_directive [PR120845]Jakub Jelinek1-16/+14
My changes for "Module Declarations Shouldn’t be Macros" paper broke the following testcase. The backup handling intentionally tries to drop CPP_PRAGMA_EOL token if things go wrong, which is desirable for the case where we haven't committed to the module preprocessing directive (i.e. changed the first token to the magic one). In that case there is no preprocessing directive start and so CPP_PRAGMA_EOL would be wrong. If there is a premature new-line after we've changed the first token though, we shouldn't drop CPP_PRAGMA_EOL, because otherwise we ICE in the FE. While clang++ and MSVC accept the testcase, in my reading it is incorrect at least in the C++23 and newer wordings and I think the changes have been a DR, https://eel.is/c++draft/cpp.module has no exception for new-lines and https://eel.is/c++draft/cpp.pre#1.sentence-2 says that new-line (unless deleted during phase 2 when after backslash) ends the preprocessing directive. The patch arranges for eol being set only in the not_module case. 2025-08-03 Jakub Jelinek <jakub@redhat.com> PR c++/120845 libcpp/ * lex.cc (cpp_maybe_module_directive): Move eol variable declaration to the start of the function, initialize to false and only set it to peek->type == CPP_PRAGMA_EOL in the not_module case. Formatting fix. gcc/testsuite/ * g++.dg/modules/cpp-21.C: New test.
2025-07-31Daily bump.GCC Administrator2-0/+14
2025-07-30Update cpplib sr.poJoseph Myers1-528/+357
* sr.po: Update.
2025-07-30libcpp: Fix up comma diagnostics in preprocessor for C++ [PR120778]Jakub Jelinek2-3/+18
The P2843R3 Preprocessing is never undefined paper contains comments that various compilers handle comma operators in preprocessor expressions incorrectly and I think they are right. In both C and C++ the grammar uses constant-expression non-terminal for #if/#elif and in both C and C++ that NT is conditional-expression, so #if 1, 2 is IMHO clearly wrong in both languages. C89 then says for constant-expression "Constant expressions shall not contain assignment, increment, decrement, function-call, or comma operators, except when they are contained within the operand of a sizeof operator." Because all the remaining identifiers in the #if/#elif expression are replaced with 0 I think assignments, increment, decrement and function-call aren't that big deal because (0 = 1) or ++4 etc. are all invalid, but for comma expressions I think it matters. In r0-56429 PR456 Joseph has added !CPP_OPTION (pfile, c99) to handle that correctly. Then C99 changed that to: "Constant expressions shall not contain assignment, increment, decrement, function-call, or comma operators, except when they are contained within a subexpression that is not evaluated." That made for C99+ #if 1 || (1, 2) etc. valid but #if (1, 2) is still invalid, ditto #if 1 ? 1, 2 : 3 In C++ I can't find anything like that though, and as can be seen on say int a[(1, 2)]; int b[1 ? 1, 2 : 3]; being accepted by C++ and rejected by C while int c[1, 2]; int d[1 ? 2 : 3, 4]; being rejected in both C and C++, so I think for C++ it is indeed just the grammar that prevents #if 1, 2. When it is the second operand of ?: or inside of () the grammar just uses expression and that allows comma operator. So, the following patch uses different decisions for C++ when to diagnose comma operator in preprocessor expressions, for C++ tracks if it is inside of () (obviously () around #embed clauses don't count unless one uses limit ((1, 2)) etc.) or inside of the second ?: operand and allows comma operator there and disallows elsewhere. BTW, I wonder if anything in the standard disallows <=> in the preprocessor expressions. Say #if (0 <=> 1) < 0 etc. #include <compare> constexpr int a = (0 <=> 1) < 0; is valid (but not valid without #include <compare>) and the expressions don't use any identifiers. 2025-07-30 Jakub Jelinek <jakub@redhat.com> PR c++/120778 * internal.h (struct lexer_state): Add comma_ok member. * expr.cc (_cpp_parse_expr): Initialize it to 0, increment on CPP_OPEN_PAREN and CPP_QUERY, decrement on CPP_CLOSE_PAREN and CPP_COLON. (num_binary_op): For C++ pedwarn on comma operator if pfile->state.comma_ok is 0 instead of !c99 or skip_eval. * g++.dg/cpp/if-comma-1.C: New test.
2025-07-26Daily bump.GCC Administrator1-0/+20
2025-07-25diagnostics: move diagnostic.c to diagnostics/context.ccDavid Malcolm1-1/+1
No functional change intended. gcc/ChangeLog: * Makefile.in (OBJS-libcommon): Replace diagnostic.o with diagnostics/context.o. gcc/c-family/ChangeLog: * c-common.cc (c_family_tests): Add include of "diagnostics/diagnostics-selftests.h". Replace c_diagnostic_cc_tests with diagnostics::selftest::context_cc_tests. * c-common.h: Drop c_diagnostic_cc_tests decl. gcc/ChangeLog: * diagnostic.h (num_digits): Move to... (diagnostics::num_digits): ...here. (get_cwe_url): Move to... (diagnostics::get_cwe_url): ...here. (maybe_line_and_column): Move to... (diagnostics::maybe_line_and_column): ...here. * diagnostic.cc: Move to... * diagnostics/context.cc: ...here. * diagnostics/diagnostics-selftests.cc (run_diagnostics_selftests): Add comment about context_cc_tests. * diagnostics/diagnostics-selftests.h: Add context_cc_tests decl. * diagnostics/sarif-sink.cc: Update for file rename. * diagnostics/source-printing.cc: Update for num_digits moving to diagnostics::num_digits. * errors.cc: Update for file rename. * input.cc: Update for num_digits moving to diagnostics::num_digits. libcpp/ChangeLog: * charset.cc: Update comment for file rename. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2025-07-25diagnostics: convert diagnostic_t to enum class diagnostics::kindDavid Malcolm1-2/+2
No functional change intended. gcc/ChangeLog: * Makefile.in: Replace diagnostic.def with diagnostics/kinds.def. * config/aarch64/aarch64.cc: Update for diagnostic_t becoming enum class diagnostics::kind. * config/i386/i386-options.cc: Likewise. * config/s390/s390.cc: Likewise. * diagnostic-core.h: Replace typedef diagnostic_t with enum class diagnostics::kind in diagnostics/kinds.h and include it. * diagnostic-global-context.cc: Update for diagnostic_t becoming enum class diagnostics::kind. * diagnostic.cc: Likewise. * diagnostic.h: Likewise. * diagnostics/buffering.cc: Likewise. * diagnostics/buffering.h: Likewise. * diagnostics/context.h: Likewise. * diagnostics/diagnostic-info.h: Likewise. * diagnostics/html-sink.cc: Likewise. * diagnostic.def: Move to... * diagnostics/kinds.def: ...here and update for diagnostic_t becoming enum class diagnostics::kind. * diagnostics/kinds.h: New file, based on material in diagnostic-core.h. * diagnostics/lazy-paths.cc: Update for diagnostic_t becoming enum class diagnostics::kind. * diagnostics/option-classifier.cc: Likewise. * diagnostics/option-classifier.h: Likewise. * diagnostics/output-spec.h: Likewise. * diagnostics/paths-output.cc: Likewise. * diagnostics/sarif-sink.cc: Likewise. * diagnostics/selftest-context.cc: Likewise. * diagnostics/selftest-context.h: Likewise. * diagnostics/sink.h: Likewise. * diagnostics/source-printing.cc: Likewise. * diagnostics/text-sink.cc: Likewise. * diagnostics/text-sink.h: Likewise. * gcc.cc: Likewise. * libgdiagnostics.cc: Likewise. * lto-wrapper.cc: Likewise. * opts-common.cc: Likewise. * opts-diagnostic.h: Likewise. * opts.cc: Likewise. * rtl-error.cc: Likewise. * substring-locations.cc: Likewise. * toplev.cc: Likewise. gcc/ada/ChangeLog: * gcc-interface/trans.cc: Update for diagnostic_t becoming enum class diagnostics::kind. gcc/analyzer/ChangeLog: * pending-diagnostic.cc: Update for diagnostic_t becoming enum class diagnostics::kind. * program-point.cc: Likewise. gcc/c-family/ChangeLog: * c-common.cc: Update for diagnostic_t becoming enum class diagnostics::kind. * c-format.cc: Likewise. * c-lex.cc: Likewise. * c-opts.cc: Likewise. * c-pragma.cc: Likewise. * c-warn.cc: Likewise. gcc/c/ChangeLog: * c-errors.cc: Update for diagnostic_t becoming enum class diagnostics::kind. * c-parser.cc: Likewise. * c-typeck.cc: Likewise. gcc/cobol/ChangeLog: * util.cc: Update for diagnostic_t becoming enum class diagnostics::kind. gcc/cp/ChangeLog: * call.cc: Update for diagnostic_t becoming enum class diagnostics::kind. * constexpr.cc: Likewise. * cp-tree.h: Likewise. * decl.cc: Likewise. * error.cc: Likewise. * init.cc: Likewise. * method.cc: Likewise. * module.cc: Likewise. * parser.cc: Likewise. * pt.cc: Likewise. * semantics.cc: Likewise. * typeck.cc: Likewise. * typeck2.cc: Likewise. gcc/d/ChangeLog: * d-diagnostic.cc: Update for diagnostic_t becoming enum class diagnostics::kind. gcc/fortran/ChangeLog: * cpp.cc: Update for diagnostic_t becoming enum class diagnostics::kind. * error.cc: Likewise. * options.cc: Likewise. gcc/jit/ChangeLog: * dummy-frontend.cc: Update for diagnostic_t becoming enum class diagnostics::kind. gcc/m2/ChangeLog: * gm2-gcc/m2linemap.cc: Update for diagnostic_t becoming enum class diagnostics::kind. * gm2-gcc/rtegraph.cc: Likewise. gcc/rust/ChangeLog: * backend/rust-tree.cc: Update for diagnostic_t becoming enum class diagnostics::kind. * backend/rust-tree.h: Likewise. * resolve/rust-ast-resolve-expr.cc: Likewise. * resolve/rust-ice-finalizer.cc: Likewise. * resolve/rust-ice-finalizer.h: Likewise. * resolve/rust-late-name-resolver-2.0.cc: Likewise. gcc/testsuite/ChangeLog: * gcc.dg/plugin/diagnostic_plugin_test_show_locus.cc: Update for diagnostic_t becoming enum class diagnostics::kind. * gcc.dg/plugin/expensive_selftests_plugin.cc: Likewise. * gcc.dg/plugin/location_overflow_plugin.cc: Likewise. * lib/gcc-dg.exp: Likewise. libcpp/ChangeLog: * internal.h: Update comment for diagnostic_t becoming enum class diagnostics::kind. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2025-07-25diagnostics: introduce diagnostics/source-printing.ccDavid Malcolm2-3/+5
Move diagnostic-show-locus.cc to diagnostics/source-printing.cc Move diagnostic-label-effects.h to diagnostics/source-printing-effects.h Move selftest-diagnostic-show-locus.h to diagnostics/selftest-source-printing.h No functional change intended. gcc/ChangeLog: * Makefile.in (OBJS): Replace diagnostic-show-locus.o with diagnostics/source-printing.o. * diagnostic.h (class diagnostic_source_effect_info): Replace with... (class diagnotics::source_effect_info): ...this. * diagnostics/paths-output.cc: Likewise. Update for move of "diagnostic-label-effects.h" to "diagnostics/source-printing-effects.h". * diagnostics/sarif-sink.cc: Update for move of "selftest-diagnostic-show-locus.h" to "diagnostics/selftest-source-printing.h". * selftest-diagnostic-show-locus.h: Move to... * diagnostics/selftest-source-printing.h: ...here. * diagnostic-label-effects.h: Move to... * diagnostics/source-printing-effects.h: ...here, updating for above changes. * diagnostic-show-locus.cc: Move to... * diagnostics/source-printing.cc: ...here. * gcc-rich-location.h: Likewise. * selftest-run-tests.cc: Likewise. * selftest.h: Likewise. gcc/testsuite/ChangeLog: * g++.dg/plugin/show-template-tree-color-labels.C: Update for moves to "source-printing". * gcc.dg/plugin/diagnostic-test-show-locus.py: Likewise. libcpp/ChangeLog: * include/cpplib.h: Update for moves to "source-printing". * include/rich-location.h (class label_effects): Move to... (class diagnostics::label_effects): ...here. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2025-07-25diagnostics: introduce namespace diagnostics::pathsDavid Malcolm1-4/+4
Move more diagnostic-specific code from gcc/ to gcc/diagnostics/ No functional change intended. contrib/ChangeLog: * filter-clang-warnings.py: Update for move of diagnostic-path-output.cc to diagnostics/paths-output.cc. gcc/ChangeLog: * Makefile.in (OBJS): Replace lazy-diagnostic-path.o with diagnostics/lazy-paths.o. (OBJS-libcommon): Replace diagnostic-path.o with diagnostics/paths.o, diagnostic-path-output.o with diagnostics/paths-output.o, and selftest-diagnostic-path.o with diagnostics/selftest-paths.o. (EXTRA_BACKEND_OBJS): Replace lazy-diagnostic-path.o with diagnostics/lazy-paths.o. * diagnostic-format-html.cc: Update #include for "diagnostic-path.h" moving to "diagnostics/paths.h", diagnostic_thread_id_t to diagnostics::paths::thread_id_t, diagnostic_event_id_t to diagnostics::paths::event_id_t, diagnostic_path to diagnostics::paths::path, and diagnostic_thread to diagnostics::paths::thread, and diagnostic_event to diagnostics::paths::event. * diagnostic-format-html.h: Likewise. * diagnostic-format-sarif.cc: Likewise. Update PROPERTY_PREFIX for threadFlowLocations from "gcc/diagnostic_event/" to "gcc/diagnostics/paths/event/". * diagnostic-format-text.cc: Likewise. * diagnostic-format-text.h: Likewise. * diagnostic.cc: Likewise. * diagnostic.h: Likewise. * diagnostic-event-id.h: Move to... * diagnostics/event-id.h: ...here, updating header guard. (diagnostics:paths:event_id_t): New typedef. (diagnostic_thread_id_t): Replace with... (diagnostics:paths:thread_id_t): New typedef. * lazy-diagnostic-path.cc: Move to... * diagnostics/lazy-paths.cc: ...here. Update for above changes, lazy_diagnostic_path becomes diagnostics::paths::lazy_path. (lazy_diagnostic_path_cc_tests): Rename to... (diagnostics_lazy_paths_cc_tests): ...this. * lazy-diagnostic-path.h: Move to... * diagnostics/lazy-paths.h: ...here, updating header guard. Update for above changes. * diagnostic-path-output.cc: Move to... * diagnostics/paths-output.cc: ...here. Update for above changes. (diagnostic_path_output_cc_tests): Rename to... (diagnostics_paths_output_cc_tests): ...this. * diagnostic-path.cc: Move to... * diagnostics/paths.cc: ...here. Update for above changes. * diagnostic-path.h: Move to... * diagnostics/paths.h: ...here, updating header guard. Update #include for moving "diagnostic-event-id.h" to "diagnostics/event-id.h". (class diagnostic_event): Convert to... (class diagnostics::paths::event): ...this. (class diagnostic_thread): Convert to... (class diagnostics::paths::thread): ...this. (class diagnostic_path): Convert to... (class diagnostics::paths::path): ...this. * diagnostic-show-locus.cc: Update for above changes. * doc/analyzer.texi: Likewise. * selftest-diagnostic-path.cc: Move to... * diagnostics/selftest-paths.cc: ...here. Update for above changes, and for "selftest-diagnostic-path.h" moving to "diagnostics/selftest-paths.h". * selftest-diagnostic-path.h: Move to... * diagnostics/selftest-paths.h: ...here, updating header guard. Update for above changes. * libgdiagnostics.cc: Update for above changes. * libsarifreplay.cc: Update property prefix for threadFlowLocations from "gcc/diagnostic_event/" to "gcc/diagnostics/paths/event/". * pretty-print-format-impl.h: Update for above changes. * pretty-print.cc: Likewise. * selftest-run-tests.cc (selftest::run_tests): Update for renaming of lazy_diagnostic_path_cc_tests to diagnostics_lazy_paths_cc_tests, and of diagnostic_path_output_cc_tests to diagnostics_paths_output_cc_tests. * selftest.h (lazy_diagnostic_path_cc_tests): Replace decl with... (diagnostics_lazy_paths_cc_tests): ...this. (diagnostic_path_output_cc_tests): Replace decl with... (diagnostics_paths_output_cc_tests): ...this. * simple-diagnostic-path.cc: Clarify that this relates to "tree" and thus shouldn't be in "diagnostics". Update for above changes. * simple-diagnostic-path.h: Likewise. gcc/analyzer/ChangeLog: * access-diagram.cc: Update for changes to diagnostic paths: "diagnostic-path.h" moving to "diagnostics/paths.h", "diagnostic-event-id.h" moving to "diagnostics/event-id.h", diagnostic_event_id_t to diagnostics::paths::event_id_t, diagnostic_path to diagnostics::paths::path, and diagnostic_event to diagnostics::paths::event. * access-diagram.h: Likewise. * analyzer.cc: Likewise. * bounds-checking.cc: Likewise. * call-info.cc: Likewise. * checker-event.cc: Likewise. * checker-event.h: Likewise. * checker-path.cc: Likewise. * checker-path.h: Likewise. * common.h: Likewise. * diagnostic-manager.cc: Likewise. * pending-diagnostic.cc: Likewise. * pending-diagnostic.h: Likewise. * program-point.cc: Likewise. * program-state.cc: Likewise. * region-model.cc: Likewise. * sm-fd.cc: Likewise. * sm-file.cc: Likewise. * sm-malloc.cc: Likewise. * sm-pattern-test.cc: Likewise. * sm-sensitive.cc: Likewise. * sm-signal.cc: Likewise. * sm-taint.cc: Likewise. * varargs.cc: Likewise. gcc/testsuite/ChangeLog: * gcc.dg/plugin/analyzer_gil_plugin.cc: Update #include for "diagnostic-path.h" moving to "diagnostics/paths.h", diagnostic_thread_id_t to diagnostics::paths::thread_id_t, diagnostic_event_id_t to diagnostics::paths::event_id_t, diagnostic_path to diagnostics::paths::path, and diagnostic_thread to diagnostics::paths::thread, and diagnostic_event to diagnostics::paths::event. * gcc.dg/plugin/diagnostic_plugin_test_paths.cc: Likewise. * lib/sarif.py (get_state_graph): Update property prefix for threadFlowLocations from "gcc/diagnostic_event/" to "gcc/diagnostics/paths/event/". * gcc.dg/sarif-output/include-chain-2.h: Update comment. libcpp/ChangeLog: * include/rich-location.h: Replace diagnostic_path with diagnostics::paths::path. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2025-06-18Daily bump.GCC Administrator1-0/+5
2025-06-17c++: modules and #pragma diagnosticJason Merrill2-0/+15
To respect the #pragma diagnostic lines in libstdc++ headers when compiling with module std, we need to represent them in the module. I think it's reasonable to give serializers direct access to the underlying data, as here with get_classification_history. This is a different approach from how Jakub made PCH streaming members of diagnostic_option_classifier, but it seems to me that modules handling belongs in module.cc. libcpp/ChangeLog: * line-map.cc (linemap_location_from_module_p): Add. * include/line-map.h: Declare it. gcc/ChangeLog: * diagnostic.h (diagnostic_option_classifier): Friend diagnostic_context. (diagnostic_context::get_classification_history): New. gcc/cp/ChangeLog: * module.cc (module_state::write_diagnostic_classification): New. (module_state::write_begin): Call it. (module_state::read_diagnostic_classification): New. (module_state::read_initial): Call it. (dk_string, dump_dc_change): New. gcc/testsuite/ChangeLog: * g++.dg/modules/warn-spec-3_a.C: New test. * g++.dg/modules/warn-spec-3_b.C: New test. * g++.dg/modules/warn-spec-3_c.C: New test.
2025-06-11Daily bump.GCC Administrator1-0/+9
2025-06-10diagnostics: make experimental-html sink prettier [PR116792]David Malcolm2-2/+35
This patch to the "experimental-html" diagnostic sink: * adds use of the PatternFly 3 CSS library (via an optional link in the generated html to a copy in a CDN) * uses PatternFly's "alert" pattern to show severities for diagnostics, properly nesting "note" diagnostics for diagnostic groups. Example: before: https://dmalcolm.fedorapeople.org/gcc/2025-06-10/before/diagnostic-ranges.c.html after: https://dmalcolm.fedorapeople.org/gcc/2025-06-10/after/diagnostic-ranges.c.html * adds initial support for logical locations and physical locations * adds initial support for multi-level nested diagnostics such as those for C++ concepts diagnostics. Ideally this would show a clickable disclosure widget to expand/collapse a level, but for now it uses nested <ul> elements with <li> for the child diagnostics. Example: before: https://dmalcolm.fedorapeople.org/gcc/2025-06-10/before/nested-diagnostics-1.C.html after: https://dmalcolm.fedorapeople.org/gcc/2025-06-10/after/nested-diagnostics-1.C.html gcc/ChangeLog: PR other/116792 * diagnostic-format-html.cc: Include "diagnostic-path.h" and "diagnostic-client-data-hooks.h". (html_builder::m_logical_loc_mgr): New field. (html_builder::m_cur_nesting_levels): New field. (html_builder::m_last_logical_location): New field. (html_builder::m_last_location): New field. (html_builder::m_last_expanded_location): New field. (HTML_STYLE): Add "white-space: pre;" to .source and .annotation. Add "gcc-quoted-text" CSS class. (html_builder::html_builder): Initialize the new fields. If CSS is enabled, add CDN links to PatternFly 3 stylesheets. (html_builder::add_stylesheet): New. (html_builder::on_report_diagnostic): Add "alert" param to make_element_for_diagnostic, setting it by default, but unsetting it for nested diagnostics below the top level. Use add_at_nesting_level for nested diagnostics. (add_nesting_level_attr): New. (html_builder::add_at_nesting_level): New. (get_pf_class_for_alert_div): New. (get_pf_class_for_alert_icon): New. (get_label_for_logical_location_kind): New. (add_labelled_value): New. (html_builder::make_element_for_diagnostic): Add leading comment. Add "alert" param. Drop class="gcc-diagnostic" from <div> tag, instead adding the class for a PatternFly 3 alert if "alert" is true, and adding a <span> with an alert icon, both according to the diagnostic severity. Add a severity prefix to the message for alerts. Add any metadata/option text as suffixes to the message. Show any logical location. Show any physical location. Don't show the locus if the last location is unchanged within the diagnostic_group. Wrap any execution path element in a <div id="execution-path"> and add a label to it. Wrap any generated patch in a <div id="suggested-fix"> and add a label to it. (selftest::test_simple_log): Update expected HTML. gcc/testsuite/ChangeLog: PR other/116792 * gcc.dg/html-output/missing-semicolon.py: Update for changes to diagnostic elements. * gcc.dg/format/diagnostic-ranges-html.py: Likewise. * gcc.dg/plugin/diagnostic-test-metadata-html.py: Likewise. Drop out-of-date comment. * gcc.dg/plugin/diagnostic-test-paths-2.py: Likewise. * gcc.dg/plugin/diagnostic-test-paths-4.py: Likewise. Drop out-of-date comment. * gcc.dg/plugin/diagnostic-test-show-locus.py: Likewise. * lib/htmltest.py (get_diag_by_index): Update to use search by id. (get_message_within_diag): Update to use search by class. libcpp/ChangeLog: PR other/116792 * include/line-map.h (typedef expanded_location): Convert to... (struct expanded_location): ...this. (operator==): New decl, for expanded_location. (operator!=): Likewise. * line-map.cc (operator==): New decl, for expanded_location. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2025-05-17Daily bump.GCC Administrator1-0/+4