public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* C++ PATCH to merge concepts-cxx2a branch
@ 2019-10-09 17:28 Jason Merrill
  2019-10-10  1:56 ` Romain Geissler
  0 siblings, 1 reply; 12+ messages in thread
From: Jason Merrill @ 2019-10-09 17:28 UTC (permalink / raw)
  To: gcc-patches List; +Cc: Andrew Sutton

[-- Attachment #1: Type: text/plain, Size: 29486 bytes --]

Andrew has done a lot of work to update the GCC implementation of C++ 
concepts to conform to the upcoming C++20 standard, which clarifies, 
removes, and changes various aspects of the earlier concepts TS.  It can 
still use some polishing, but other stage 1 projects are waiting for it 
to land on trunk and it's already a big improvement from what's 
currently there, so I'm going to go ahead and merge it now.

Tested x86_64-pc-linux-gnu, applying to trunk.

>     Update the concepts implementation to conform to C++20.
>     
>     gcc/c-family/
>             * c-cppbuiltin.c (c_cpp_builtins): Use new feature test values for
>             concepts when -std=c++2a. Bump __cpp_concepts to 201907.
>             * c.opt: Add -Wconcepts-ts.
>             * c-opts.c (c_common_post_options): Warn when -fconcepts is used
>             with -std=c++2a. Disable warning for -fconcepts in C++20 mode.
>             (set_std_cxx2a): Enable concepts by default.
>     gcc/cp/
>             * call.c (build_new_function_call): Don't evaluate concepts here.
>             (constraint_failure): Don't record the template.
>             (print_z_candidate): Don't extract the template.
>             * class.c (add_method): When overloading, hide ineligible special
>             member fns.
>             (check_methods): Set TYPE_HAS_COMPLEX_* here.
>             * constexpr.c (cxx_eval_constant_expression): Evaluate concepts.
>             (maybe_initialize_fundef_copies_table): Remove.
>             (get_fundef_copy): Use hash_map_safe_get_or_insert.
>             (clear_cv_and_fold_caches): Clear the satisfaction cache.
>             * constraint.cc (known_non_bool_p): New.
>             (parsing_constraint_expression_sentinel): Renamed from
>             expanding_constraint_sentinel.
>             (check_constraint_operands): New.
>             (check_constraint_atom): New.
>             (finish_constraint_binary_op): New.
>             (finish_constraint_or_expr): Likewise.
>             (finish_constraint_and_expr): Likewise.
>             (finish_constraint_primary_expr): Likewise.
>             (combine_constraint_expressions): New.
>             (finish_requires_expr): Add location parm.
>             (get_concept_definition): Return the initializer of concept definitions.
>             (get_template_head_requirements): New.
>             (get_trailing_function_requirements): New.
>             (deduce_constrained_parameter): Check if the identifier or template-id
>             is a concept definition.
>             (resolve_concept_definition_check): Removed.
>             (resolve_variable_concept_check): Removed.
>             (resolve_concept_check): New.
>             (resolve_constraint_check): Handle concept definitions.
>             converting arguments.
>             (function_concept_check_p): Removed.
>             (variable_concept_check_p): Removed.
>             (unpack_concept_check): New.
>             (get_concept_check_template): New.
>             (build_call_check): Moved and renamed to build_function_check.
>             (build_concept_check_arguments): make static.
>             (build_function_check): Always do overload resolution
>             in order to force conversion of template arguments (i.e., actually
>             check that the use of a concept is valid).
>             (build_standard_check): Renamed from build_real_concept_check.
>             (build_real_concept_check): Build checks for C++2a concepts by
>             (build_wildcard_concept_check): New.
>             (build_concept_check): Use build_real_concept_check. New overload.
>             (build_constraints): Save expressions, not normalized constraints.
>             (build_concept_id): New. Pass tf_warning_or_error.
>             (build_type_constraint): New.
>             (finish_type_constraints): New.
>             (associate_classtype_constraints): Also add constraints to union
>             types. Note the original declaration in errors. Don't return
>             error_mark_node in order to avoid an assertion later.
>             (push_down_pack_expansion): Remove.
>             (finish_shorthand_constraint): Make fold expressions, not naked
>             parameter packs. Always apply the constraint to each template argument.
>             (check_introduction_list): New. Fail if not enough
>             names are introduced.
>             (finish_template_introduction): Don't normalize constraints. Pass
>             tsubst flags. Check for insufficient introductions.
>             (placeholder_extract_concept_and_args): Handle the template-id case.
>             Unpack function concept checks correctly.
>             (tsubst_simple_requirement): Return errors if they occur. Don't
>             process as a template.
>             (tsubst_type_requirement): Likewise.
>             (type_deducible_p): New. Wrap the input expression in parens for the
>             purpose of deduction.
>             (expression_convertible_t): New.
>             (tsubst_compound_requirement): Use new deduction, conversion predicates.
>             (tsubst_nested_requirement): Return errors if they occur. Don't
>             process as a template. Instantiate and evaluate the nested requirement.
>             (tsubst_valid_expression_requirement): New.
>             (tsubst_simple_requirement): Use tsubst_valid_expression_requirement.
>             (tsubst_compound_requirement): Use tsubst_valid_expression_requirement.
>             (check_constaint_variables): New.
>             (tsubst_constraint_variables): Check that type substitutions are valid.
>             (tsubst_requires_expr): Likewise. Produce new requires-exprs during
>             template substitution. Copy the previous local specialization stack,
>             so references to non-local parameters can be found. Use cp_unevaluated.
>             (tsubst_constraint): New. Don't evaluate concept checks.
>             (subst_info): New.
>             (norm_info): New. Used to build a normalization tree for concept check
>             diagnostics.
>             (debug_parameter_mapping): New.
>             (debug_argument_list): New.
>             (expand_concept): Removed.
>             (normalize_logical_operation): Pass subst_info through call.
>             (normalize_pack_expansion): Remove.
>             (normalize_simple_requirement): Removed
>             (normalize_type_requirement): Removed
>             (normalize_compound_requirement): Removed
>             (normalize_nested_requirement): Removed
>             (normalize_requirement): Removed
>             (normalize_requirements): Removed
>             (normalize_requires_expression): Removed
>             (normalize_variable_concept_check): Removed.
>             (normalize_function_concept_check): Removed.
>             (normalize_concept_check): Merged all normalize_*_check here.
>             Substitute through written template arguments before normalizing the
>             definition. Only substitute the innermost template arguments.
>             (check_for_logical_overloads): Delete.
>             (map_arguments): New. Associate template parameters with arguments.
>             (build_parameter_mapping): New. Extract used parameters.
>             (normalize_expression): Rewrite.
>             (normalize_conjunction): Removed
>             (normalize_disjunction): Removed
>             (normalize_predicate_constraint): Removed
>             (normalize_parameterized_constraint): Removed
>             (normalized_map): New variable.
>             (get_normalized_constraints): New entry point for normalization.
>             Establishes a timer.
>             (get_normalized_constraints_from_info): New.
>             (get_normalized_constraints_from_decl): New. Turn on template processing
>             prior to normalization. Handle inheriting ctors. Build the
>             normalization arguments from the full set of template parameters of the
>             most general template. This guarantees that we have no concrete arguments
>             in the parameter mapping (e.g., from template members of class
>             templates). Cache normalizations.
>             (normalize_concept_definition): New. Cache normalizations.
>             (normalize_template_requirements): New.
>             (normalize_nontemplate_requirements): New.
>             (normalize_constraint_expression): New.
>             (tsubst_parameter_mapping): New.
>             (get_mapped_args): New.
>             (parameter_mapping_equivalent_p): New. Use template_args_equal.
>             (atomic_constraints_identical_p): New.
>             (hash_atomic_constraint): New.
>             (satisfying_constraint_p): New. Guard against recursive evaluation of
>             constraints during satisfaction.
>             (satisfy_conjunction): New.
>             (satisfy_disjunction): New.
>             (sat_entry): New class for hashing satisfaction results.
>             (sat_hasher): New hash traits.
>             (sat_cache): New.
>             (get_satisfaction): New. Returns cached satisfaction result.
>             (save_satisfaction): New. Caches a satisfaction result.
>             (clear_satisfaction_cache): New.
>             (satisfaction_cache): New. Helps manage satisfaction cache requests.
>             (decl_satisfied_cache): New.
>             (satisfy_atom): New.
>             (satisfy_constraint_r): New.
>             (satisfy_constraint): Use new satisfaction algorithm.
>             (evaluate_concept_check): New.
>             (evaluate_concept): Removed.
>             (evaluate_function_concept): Removed.
>             (evaluate_variable_concept): Removed.
>             (satisfy_constraint_expression): New.
>             (constraint_expression_satisfied_p): New.
>             (constraints_satisfied_p): Use strip_inheriting_ctors. Use
>             push_/pop_access_scope.
>             (more_constrained): Normalize before calling out to subsumption. Allow
>             classes as arguments.
>             (strictly_subsumes): Allow non-templates as arguments. Accept a new
>             template argument.
>             (weakly_subsumes): New.
>             (at_least_as_constrained): Removed.
>             (diagnose_other_expression): Removed.
>             (diagnose_predicate_constraint): Removed.
>             (diagnose_pack_expansion): Removed.
>             (diagnose_check_constraint): Removed.
>             (diagnose_logical_constraint): Removed.
>             (diagnose_expression_constraint): Removed.
>             (diagnose_type_constraint): Removed.
>             (diagnose_implicit_conversion_constraint): Removed.
>             (diagnose_argument_deduction_constraint): Removed.
>             (diagnose_exception_constraint): Removed.
>             (diagnose_parameterized_constraint): Removed.
>             (diagnose_argument_deduction_constraint): Removed.
>             (diagnose_argument_deduction_constraint): Removed.
>             (diagnose_argument_deduction_constraint): Removed.
>             (diagnose_trait_expr): New.
>             (diagnose_requires_expr): New.
>             (diagnose_atomic_constraint): New.
>             (diagnose_valid_expression) Stop wrongly diagnosing valid expressions.
>             Don't substitute as if in template decls. This causes substitution
>             to generate expressions that aren't suitable for use with the noexcept
>             routines.
>             (diagnose_valid_type) Likewise.
>             (diagnose_compound_requirement) Actually emit diagnostics for
>             the causes of errors.Call force_paren_expr_uneval.
>             (diagnose_declaration_constraints): Turn on template processing to
>             suppress certain analyses.
>             * cp-objcp-common.c (cp_common_init_ts): Make concepts typed.
>             (cp_get_debug_type): Use hash_map_safe_*.
>             * cp-tree.h: New function declarations for semantic actions, other
>             facilities. Remove declaration no longer used or needed. Remove
>             unused _CONSTR macros.
>             (LANG_DECL_HAS_MIN): Add CONCEPT_DECL.
>             (template_info_decl_check): Factor macro check into an inline function.
>             (DECL_TEMPLATE_INFO): Use new check facility.
>             (finish_concept_definition): New. Don't invalid concept declarations
>             with invalid initializers.
>             (find_template_parameters): New.
>             (concept_definition_p): New.
>             (concept_check_p): New.
>             (variable_concept_check_p): New.
>             (force_paren_expr_uneval): New.
>             (ovl_iterator::using_p): A USING_DECL by itself was also
>             introduced by a using-declaration.
>             (struct tree_template_info): Use tree_base instead of
>             tree_common. Add tmpl and args fields.
>             (TI_TEMPLATE, TI_ARGS): Adjust.
>             (DECLTYPE_FOR_INIT_CAPTURE): Remove.
>             (CONSTR_CHECK, CONSTR_INFO, CONSTR_EXPR, CONSTR_CONTEXT): New.
>             (ATOMIC_CONSTR_MAP, TRAIT_EXPR_LOCATION): New.
>             (struct tree_trait_expr): Add locus field.
>             (enum tsubst_flags): Add tf_norm as a hint to generate normalization
>             context when diagnosing constraint failure.
>             * cp-tree.def: Remove unused _CONSTR nodes and rename PRED_CONSTR
>             to ATOMIC_CONSTR.
>             (CONCEPT_DECL): New.
>             * cxx-pretty-print.c: Remove constraint printing code.
>             (pp_cxx_concept_definition): New.
>             (pp_cxx_template_declaration): Print concept definitions.
>             (pp_cxx_check_constraint): Update printing for concept definitions.
>             (pp_cxx_nested_name_specifier): Fix a weird
>             case where we're printing '::::' for concepts.
>             (simple_type_specifier): Print requirements for placeholder types.
>             (pp_cxx_constrained_type_spec): Print the associated requirements of
>             a placeholder type.
>             (pp_cxx_compound_requirement): Add space before the '->'.
>             (pp_cxx_parameter_mapping): Print the parameter mapping.
>             (pp_cxx_atomic_constraint): Use the function above.
>             * decl.c (redeclaration_error_message): New error for concepts.
>             (grokdeclarator): Check for and disallow decltype(auto) in parameter
>             declarations.
>             (grokfndecl): Don't normalize constraints. Add check for constraints
>             on declaration.
>             (grokvardecl): Don't normalize constraints.
>             (grok_special_member_properties): Don't set TYPE_HAS_COMPLEX_*.
>             (function_requirements_equivalent_p): New. Compare trailing
>             requires clauses. Compare combined constraints in pre-C++20 mode.
>             (decls_match): Compare trailing requires clauses. Compare template
>             heads for function templates. Remove old constraint comparison.
>             Simplify comparison of functions, function templates.
>             (duplicate_function_template_decls): New. Refactor a nasty if
>             condition into a single predicate.
>             (require_deduced_type): Don't complain if we already complained about
>             deduction failure.
>             (finish_function): Perform auto deduction to ensure that constraints
>             are checked even when functions contain no return statements. Only do
>             auto deduction if we haven't previously seen any return statements.
>             This prevents multiple diagnostics of the same error.
>             (store_decomp_type): Remove.
>             (cp_finish_decomp): Use hash_map_safe_put.
>             * error.c: Remove constraint printing code.
>             (dump_decl): Dump concept definitions. Handle wildcard declarations.
>             (dump_template_decl): Likewise.
>             (dump_type): Print associated requirements for placeholder
>             types.
>             (rebuild_concept_check): New.
>             (maybe_print_single_constraint_context): New.
>             (maybe_print_constraint_context): Recursively print nested contexts.
>             * init.c (get_nsdmi): Use hash_map_safe_*.
>             * lambda.c (maybe_add_lambda_conv_op): Bail if deduction failed.
>             (add_capture): Copy parameter packs from init.
>             (lambda_capture_field_type): Always use auto for init-capture.
>             * logic.cc: Completely rewrite.
>             (constraint_hash): New.
>             (clause/ctor): Save atoms in the hash table.
>             (replace): Save atoms during replacement.
>             (insert): Save atoms during insertion.
>             (contains): Only search the hash table for containment.
>             (clause): Keep a hash of atomic constraints.
>             (clause::clause): Explicitly copy the hash table when copying.
>             (disjunction_p, conjunction_p, atomic_p, dnf_size, cnf_size): New.
>             (diagnose_constraint_size): New.
>             (subsumes_constraints_nonnull): Compare the sizes of normalized formula
>             to determine the cheapest decomposition.
>             * name-lookup.c (diagnose_name_conflict): Diagnose name issues with
>             concepts.
>             (matching_fn_p): Check constraints.
>             (push_class_level_binding_1): Move overloaded functions case down,
>             accept FUNCTION_DECL as target_decl.
>             * parser.c (enum required_token): New required token for auto.
>             (make_location): Add overload taking lexer as last parm.
>             (cp_parser_required_error): Diagnose missing auto.
>             (cp_parser_diagnose_ungrouped_constraint_plain): New.
>             (cp_parser_diagnose_ungrouped_constraint_plain): New.
>             (cp_parser_constraint_primary_expression): New. Tentatively parse the
>             primary expression. If that fails tentatively parse a lower
>             precedence expression in order to diagnose the error.
>             (cp_parser_check_non_logical_constraint): New. Performs a trial
>             parse of the right-hand-side of non-logical operators in order to
>             generate good diagnostics.
>             (cp_parser_constraint_logical_and_expression): New.
>             (cp_parser_constraint_logical_or_expression): New.
>             (cp_parser_requires_clause_expression): New.
>             (cp_parser_requires_clause): Renamed to cp_parser_constraint_expression.
>             (cp_parser_requires_clause_opt): Parse the requires-clause differently
>             in -fconcepts and -std=c++2a modes.
>             (cp_parser_requirement_list): Rename to cp_parser_requirement_seq.
>             Rewrite so that semicolons are parsed
>             along with requirements, not the sequence.
>             (cp_parser_simple_requirement): Expect a semicolon at end.
>             (cp_parser_compound_requirement): Expect a semicolon at end. Only
>             allow trailing-return-type with -fconcepts-ts.
>             (cp_parser_nested_requirement): Expect a semicolon at end. Parse
>             constraint-expressions.
>             (cp_parser_concept_definition): New. Don't fail parsing the concept
>             definition if the initializer is ill-formed. Don't declare the concept
>             before parsing the initializer.
>             (cp_parser_constraint_expression): Declare earlier.
>             (cp_parser_type_requirement): Current scope is not valid.
>             (cp_parser_requires_expression): Commit to the tentative parse.
>             (cp_parser_decl_specifier_seq): Warn when concept appears to be used
>             as a decl-specifier.
>             (cp_parser_template_declaration_after_parameters): Parse concept
>             definitions.
>             (cp_parser_template_id): Don't try to resolve a concept template-id yet.
>             (cp_parser_template_id_expr): Resolve it as a concept check.
>             (cp_parser_decl_specifier_seq): Warn on 'concept bool'.
>             (cp_parser_type_parameter): Combine expressions not
>             constraints.
>             (cp_parser_explicit_template_declaration): Combine expressions not
>             constraints.
>             (cp_parser_maybe_concept_name): Removed.
>             (cp_parser_simple_type_specifier): Handle an error condition of
>             a bad constrained type specifier. Expect auto or decltype after
>             a concept name. Also handle the case where we have a template-id
>             as a concept check.
>             (cp_parser_template_introduction): Diagnose errors on invalid
>             introductions. Give up if it doesn't start with a concept name.
>             Pedwarn if not -fconcepts-ts.
>             (synthesize_implicit_template_parm): Don't do consistent binding.
>             Use a new flag for constrained parameters. Combine expressions,
>             not constraints. Fail if we get a placeholder in block scope.
>             Placeholders that do not constrain types are not allowed in parameter
>             declarations, so don't handle them.
>             (cp_parser_placeholder_type_specifier): New. Implement parsing of
>             placeholder type specifiers following a concept name or partial
>             concept check. Disallow decltype(auto) parameters.
>             (cp_parser_nested_name_specifier_opt): If the token is already
>             CPP_NESTED_NAME_SPECIFIER, leave it alone.
>             (cp_parser_id_expression, cp_parser_unqualified_id): Call
>             cp_parser_template_id_expr.
>             (cp_parser_placeholder_type_specifier): Add tentative parm.  Don't
>             expect a WILDCARD_DECL.
>             (cp_parser_trait_expr): Pass trait_loc down.
>             (cp_parser_postfix_expression): Do set location of dependent member
>             call.
>             * pt.c (finish_concept_definition): New.
>             (push_template_decl_real): Handle concept definitions.
>             (start_concept_definition): Let push_template_decl_real handle the
>             creation of the template.
>             (get_constraints): Return null if the table hasn't been initialized.
>             (tsubst_copy_and_build): Build template-id expressions for concept
>             checks.
>             [TRAIT_EXPR]: Pass trait_loc down.
>             (lookup_template_class_1): Add the template name to the constraint
>             failure diagnostic.
>             (lookup_and_finish_template_variable): Build concept checks
>             with the correct arguments.
>             (tsubst_function_decl): Don't substitute through constraints.
>             Always associate constraints with functions.
>             (template_parm_level_and_index): Make non-static.
>             (for_each_template_parm_r): Handle requires expressions.
>             (keep_template_parm): New.
>             (find_template_parameters): New.
>             (more_specialized_fn): Change how winners and losers are chosen.
>             (make_constrained_auto): Don't normalize constraints.
>             (template_parameters_equivalent_p): New. Compare template
>             parameters. Add a comparison for implicitly vs. explicitly declared
>             parameters.
>             (template_parameter_lists_equivalent_p): New. Compare template
>             parameter lists.
>             (template_requirements_equivalent_p): New.
>             (template_heads_equivalent_p): New. Compare template heads.
>             (template_parameter_constraints_equivalent_p): New.
>             (is_compatible_template_arg): Use weakly_subsumes.
>             (maybe_new_partial_specialization): Use new constraint comparison
>             for finding specializations.
>             (process_partial_specialization): Pass main template as argument.
>             (more_specialized_partial_spec): Don't immediately return when
>             detecting a winner.
>             (make_constrained_auto): Handle concept definitions.
>             (do_auto_deduction): Update auto deduction for new concept model.
>             Extract the function concept correctly; rename constr to check to
>             reflect the kind of node.
>             (tsubst): Adjust wildcard argument during substitution.
>             [DECLTYPE_TYPE]: Remove init-capture handling.
>             (tsubst_copy_and_build): Build concept checks, not template ids.
>             Defer checks of function concepts. Handle concepts before variable
>             templates. Handle calls to function concepts explicitly.
>             (coerce_template_parms): Use concept_definition_p. Handle a deduction
>             error where a potentially empty pack can be supplied after the last
>             parameter of a concept.
>             (finish_template_variable): Don't process concepts here.
>             (instantiation_dependent_r): Use concept_check_p.
>             (tsubst_template_args): Make non-static.
>             (make_constrained_placeholder_type): New. Refactored from
>             make_constrained_auto.
>             (make_constrained_auto) Use make_constrained_placeholder_type.
>             (make_constrained_decltype_auto) New.
>             (tsubst_function_parms): New.
>             (value_dependent_expression_p) [TEMPLATE_ID_EXPR]: Use
>             concept_definition_p.
>             (push_access_scope, pop_access_scope): No longer static.
>             (tsubst_template_parm): Substitute TEMPLATE_PARM_CONSTRAINTS.
>             (tsubst_friend_function): Use tsubst_constraint. Use generic_targs_for.
>             (get_underlying_template) Use generic_targs_for.
>             (uses_parameter_packs): Return tree.
>             (gen_elem_of_pack_expansion_instantiation): Don't push
>             local_specialization_stack.
>             (prepend_one_capture): New.
>             (tsubst_lambda_expr): Use prepend_one_capture.  Don't touch
>             local_specializations.
>             (template_parms_level_to_args): No longer static.
>             (add_outermost_template_args): Likewise.
>             (find_template_parameter_info): New. Provide context for finding
>             template parameters.
>             (keep_template_parm): Don't keep parameters declared at depth levels
>             greater than those of the template parameters of the source declaration.
>             Don't propagate cv-qualified types. Return 0, so we find all template
>             parameters, not the just first.
>             (any_template_parm_r): New. Handle cases that are mishandled by
>             for_each_template_parm_r.
>             (generic_targs_for): Factor out of coerce_template_args_for_ttp.
>             (tsubst_argument_pack): Factor out of tsubst_template_args.
>             (constraint_sat_entry): Removed.
>             (constraint_sat_hasher): Removed.
>             (concept_spec_entry): Removed.
>             (concept_spec_hasher): Removed.
>             (constraint_memos): Removed.
>             (concept_memos): Removed.
>             (lookup_constraint_satisfaction): Removed.
>             (memoize_constraint_satisfaction): Removed.
>             (lookup_concept_satisfaction): Removed.
>             (memoize_concept_satisfaction): Removed.
>             (concept_expansions): Removed.
>             (get_concept_expansion): Removed.
>             (save_concept_expansion): Removed.
>             (init_constraint_processing): Remove initialization of non-existing
>             resources.
>             (find_template_requirement): New. Search for the sub-requirement
>             within the associated constraints.
>             (convert_generic_types_to_packs): Also transform the associated
>             constraint and update the current template requirements.
>             (store_defaulted_ttp, lookup_defaulted_ttp): Remove.
>             (add_defaults_to_ttp): Use hash_map_safe_*.
>             * semantics.c (finish_call_expr): Diagnose calls to concepts.
>             Handle concept checks explicitly.
>             (finish_id_expression): Evaluate variable concepts as part of
>             id-expression processing. Don't treat variable concepts as variables,
>             and don't process function concepts as plain id-expressions.
>             (force_paren_expr): Add even_uneval parm.
>             (finish_trait_expr): Add location parm.
>             * tree.c (special_memfn_p): New.
>             (cp_expr_location): Handle TRAIT_EXPR.
>             * typeck.c (check_return_expr): Actually use the diagnostic kind
>             when performing return-type deduction.
>             * typeck2.c (build_functional_cast): Don't rely on the location of
>             'auto'.
>     gcc/testsuite/
>             * lib/target-supports.exp (check_effective_target_concepts): Check
>             for std=c++2a.
>     gcc/
>             * doc/invoke.texi: Document -fconcepts-ts.

[-- Attachment #2: concepts-merge.diff.xz --]
[-- Type: application/x-xz, Size: 107620 bytes --]

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: C++ PATCH to merge concepts-cxx2a branch
  2019-10-09 17:28 C++ PATCH to merge concepts-cxx2a branch Jason Merrill
@ 2019-10-10  1:56 ` Romain Geissler
  2019-10-10 19:56   ` Christophe Lyon
  0 siblings, 1 reply; 12+ messages in thread
From: Romain Geissler @ 2019-10-10  1:56 UTC (permalink / raw)
  To: Jason Merrill; +Cc: gcc-patches List, Andrew Sutton

Le mer. 9 oct. 2019 à 19:20, Jason Merrill <jason@redhat.com> a écrit :
>
> Andrew has done a lot of work to update the GCC implementation of C++
> concepts to conform to the upcoming C++20 standard, which clarifies,
> removes, and changes various aspects of the earlier concepts TS.  It can
> still use some polishing, but other stage 1 projects are waiting for it
> to land on trunk and it's already a big improvement from what's
> currently there, so I'm going to go ahead and merge it now.
>
> Tested x86_64-pc-linux-gnu, applying to trunk.

Hi Jason,

This is a very good news to see preliminary concept support being
merged in the trunk :)

However for me, this caused the following bootstrap failure:

In file included from /workdir/src/gcc-10.0.0/gcc/cp/cp-lang.c:24:
/workdir/src/gcc-10.0.0/gcc/cp/cp-tree.h: In function 'tree_node*
template_info_decl_check(const_tree, const char*, int, const char*)':
/workdir/src/gcc-10.0.0/gcc/cp/cp-tree.h:3368:3: error:
'tree_check_failed' was not declared in this scope
   tree_check_failed (t, f, l, fn,
   ^~~~~~~~~~~~~~~~~
/workdir/src/gcc-10.0.0/gcc/cp/cp-tree.h:3368:3: note: suggested
alternative: 'vec_check_alloc'
   tree_check_failed (t, f, l, fn,
   ^~~~~~~~~~~~~~~~~
   vec_check_alloc
make[2]: *** [Makefile:1118: cp/cp-lang.o] Error 1

Cheers,
Romain

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: C++ PATCH to merge concepts-cxx2a branch
  2019-10-10  1:56 ` Romain Geissler
@ 2019-10-10 19:56   ` Christophe Lyon
  2019-10-10 21:45     ` Jason Merrill
  0 siblings, 1 reply; 12+ messages in thread
From: Christophe Lyon @ 2019-10-10 19:56 UTC (permalink / raw)
  To: Romain Geissler; +Cc: Jason Merrill, gcc-patches List, Andrew Sutton

Hi,


On Thu, 10 Oct 2019 at 01:44, Romain Geissler <romain.geissler@gmail.com>
wrote:

> Le mer. 9 oct. 2019 à 19:20, Jason Merrill <jason@redhat.com> a écrit :
> >
> > Andrew has done a lot of work to update the GCC implementation of C++
> > concepts to conform to the upcoming C++20 standard, which clarifies,
> > removes, and changes various aspects of the earlier concepts TS.  It can
> > still use some polishing, but other stage 1 projects are waiting for it
> > to land on trunk and it's already a big improvement from what's
> > currently there, so I'm going to go ahead and merge it now.
> >
> > Tested x86_64-pc-linux-gnu, applying to trunk.
>
> Hi Jason,
>
> This is a very good news to see preliminary concept support being
> merged in the trunk :)
>
> However for me, this caused the following bootstrap failure:
>
> In file included from /workdir/src/gcc-10.0.0/gcc/cp/cp-lang.c:24:
> /workdir/src/gcc-10.0.0/gcc/cp/cp-tree.h: In function 'tree_node*
> template_info_decl_check(const_tree, const char*, int, const char*)':
> /workdir/src/gcc-10.0.0/gcc/cp/cp-tree.h:3368:3: error:
> 'tree_check_failed' was not declared in this scope
>    tree_check_failed (t, f, l, fn,
>    ^~~~~~~~~~~~~~~~~
> /workdir/src/gcc-10.0.0/gcc/cp/cp-tree.h:3368:3: note: suggested
> alternative: 'vec_check_alloc'
>    tree_check_failed (t, f, l, fn,
>    ^~~~~~~~~~~~~~~~~
>    vec_check_alloc
> make[2]: *** [Makefile:1118: cp/cp-lang.o] Error 1
>
>
On arm, this is causing:
 FAIL: g++.dg/ext/arm-fp16/arm-fp16-ops-1.C  -std=gnu++2a (test for excess
errors)
Excess errors:
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:31:10: warning: '++'
expression of 'volatile'-qualified type is deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:33:12: warning: '++'
expression of 'volatile'-qualified type is deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:36:12: warning: '--'
expression of 'volatile'-qualified type is deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:38:10: warning: '--'
expression of 'volatile'-qualified type is deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:96:13: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:98:13: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:100:13: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:103:13: warning: compound
assignment with 'volatile'-qualified left operand is deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:103:13: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:105:13: warning: compound
assignment with 'volatile'-qualified left operand is deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:105:13: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:107:13: warning: compound
assignment with 'volatile'-qualified left operand is deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:107:13: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:110:13: warning: compound
assignment with 'volatile'-qualified left operand is deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:110:13: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:112:13: warning: compound
assignment with 'volatile'-qualified left operand is deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:112:13: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:114:13: warning: compound
assignment with 'volatile'-qualified left operand is deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:114:13: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:118:13: warning: compound
assignment with 'volatile'-qualified left operand is deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:118:13: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:120:13: warning: compound
assignment with 'volatile'-qualified left operand is deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:120:13: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:122:13: warning: compound
assignment with 'volatile'-qualified left operand is deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:122:13: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:125:13: warning: compound
assignment with 'volatile'-qualified left operand is deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:125:13: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:127:13: warning: compound
assignment with 'volatile'-qualified left operand is deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:127:13: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:129:13: warning: compound
assignment with 'volatile'-qualified left operand is deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:129:13: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:6:46: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:6:46: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:6:46: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:6:46: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:6:46: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:6:46: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:6:46: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:6:46: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:6:46: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:6:46: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:6:46: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:6:46: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:6:46: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:6:46: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:6:46: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:6:46: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:6:46: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:6:46: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:6:46: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]
/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:6:46: warning: using
value of simple assignment with 'volatile'-qualified left operand is
deprecated [-Wvolatile]

and similar on arm-fp16-ops-[1-8]

and also:
FAIL: g++.dg/cpp2a/constexpr-dtor3.C  -std=c++2a (test for excess errors)
Excess errors:
/gcc/testsuite/g++.dg/cpp2a/constexpr-dtor3.C:152:12:   in 'constexpr'
expansion of '(& w13)->W7::~W7()'

Christophe



> Cheers,
> Romain
>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: C++ PATCH to merge concepts-cxx2a branch
  2019-10-10 19:56   ` Christophe Lyon
@ 2019-10-10 21:45     ` Jason Merrill
  2019-10-11  8:19       ` Christophe Lyon
  2019-10-11  8:33       ` [PATCH] Fix constexpr-dtor3.C FAIL on arm Jakub Jelinek
  0 siblings, 2 replies; 12+ messages in thread
From: Jason Merrill @ 2019-10-10 21:45 UTC (permalink / raw)
  To: Christophe Lyon; +Cc: Romain Geissler, gcc-patches List, Andrew Sutton

On Thu, Oct 10, 2019 at 3:55 PM Christophe Lyon <christophe.lyon@linaro.org>
wrote:

> On Thu, 10 Oct 2019 at 01:44, Romain Geissler <romain.geissler@gmail.com>
> wrote:
>
>> Le mer. 9 oct. 2019 à 19:20, Jason Merrill <jason@redhat.com> a écrit :
>> >
>> > Andrew has done a lot of work to update the GCC implementation of C++
>> > concepts to conform to the upcoming C++20 standard, which clarifies,
>> > removes, and changes various aspects of the earlier concepts TS.  It can
>> > still use some polishing, but other stage 1 projects are waiting for it
>> > to land on trunk and it's already a big improvement from what's
>> > currently there, so I'm going to go ahead and merge it now.
>> >
>> > Tested x86_64-pc-linux-gnu, applying to trunk.
>>
>> Hi Jason,
>>
>> This is a very good news to see preliminary concept support being
>> merged in the trunk :)
>>
>> However for me, this caused the following bootstrap failure:
>>
>> In file included from /workdir/src/gcc-10.0.0/gcc/cp/cp-lang.c:24:
>> /workdir/src/gcc-10.0.0/gcc/cp/cp-tree.h: In function 'tree_node*
>> template_info_decl_check(const_tree, const char*, int, const char*)':
>> /workdir/src/gcc-10.0.0/gcc/cp/cp-tree.h:3368:3: error:
>> 'tree_check_failed' was not declared in this scope
>>    tree_check_failed (t, f, l, fn,
>>    ^~~~~~~~~~~~~~~~~
>> /workdir/src/gcc-10.0.0/gcc/cp/cp-tree.h:3368:3: note: suggested
>> alternative: 'vec_check_alloc'
>>    tree_check_failed (t, f, l, fn,
>>    ^~~~~~~~~~~~~~~~~
>>    vec_check_alloc
>> make[2]: *** [Makefile:1118: cp/cp-lang.o] Error 1
>>
>>
> On arm, this is causing:
>  FAIL: g++.dg/ext/arm-fp16/arm-fp16-ops-1.C  -std=gnu++2a (test for excess
> errors)
> Excess errors:
> /gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:31:10: warning: '++'
> expression of 'volatile'-qualified type is deprecated [-Wvolatile]
>

These would be due to

2019-08-28  Marek Polacek  <polacek@redhat.com>

        Implement P1152R4: Deprecating some uses of volatile.
        PR c++/91361
        * cp-gimplify.c (cp_fold): Set TREE_THIS_VOLATILE.
        * decl.c (grokdeclarator): Warn about a volatile-qualified
structured
        binding and return type.
        (grokparms): Warn about a volatile-qualified function parameter.
        * expr.c (mark_use) <case MODIFY_EXPR>: Emit a -Wvolatile warning.
        * typeck.c (cp_build_unary_op): Emit a -Wvolatile warning for pre
and
        post ++/-- on a volatile operand.
        (genericize_compound_lvalue): Use a better location.  Don't lose
        TREE_THIS_VOLATILE.
        (cp_build_modify_expr): Emit a -Wvolatile warning for a compound
        assignment whose LHS is volatile-qualified.  Build the assignment
with
        a more precise location.

and not the concepts merge.  You probably want to turn off -Wvolatile for
affected tests.

 and also:

> FAIL: g++.dg/cpp2a/constexpr-dtor3.C  -std=c++2a (test for excess errors)
> Excess errors:
> /gcc/testsuite/g++.dg/cpp2a/constexpr-dtor3.C:152:12:   in 'constexpr'
> expansion of '(& w13)->W7::~W7()'
>

This also seems unrelated, but I'll take a look.

Jason

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: C++ PATCH to merge concepts-cxx2a branch
  2019-10-10 21:45     ` Jason Merrill
@ 2019-10-11  8:19       ` Christophe Lyon
  2019-10-11  8:33       ` [PATCH] Fix constexpr-dtor3.C FAIL on arm Jakub Jelinek
  1 sibling, 0 replies; 12+ messages in thread
From: Christophe Lyon @ 2019-10-11  8:19 UTC (permalink / raw)
  To: Jason Merrill; +Cc: Romain Geissler, gcc-patches List, Andrew Sutton

On Thu, 10 Oct 2019 at 23:38, Jason Merrill <jason@redhat.com> wrote:

> On Thu, Oct 10, 2019 at 3:55 PM Christophe Lyon <
> christophe.lyon@linaro.org> wrote:
>
>> On Thu, 10 Oct 2019 at 01:44, Romain Geissler <romain.geissler@gmail.com>
>> wrote:
>>
>>> Le mer. 9 oct. 2019 à 19:20, Jason Merrill <jason@redhat.com> a écrit :
>>> >
>>> > Andrew has done a lot of work to update the GCC implementation of C++
>>> > concepts to conform to the upcoming C++20 standard, which clarifies,
>>> > removes, and changes various aspects of the earlier concepts TS.  It
>>> can
>>> > still use some polishing, but other stage 1 projects are waiting for it
>>> > to land on trunk and it's already a big improvement from what's
>>> > currently there, so I'm going to go ahead and merge it now.
>>> >
>>> > Tested x86_64-pc-linux-gnu, applying to trunk.
>>>
>>> Hi Jason,
>>>
>>> This is a very good news to see preliminary concept support being
>>> merged in the trunk :)
>>>
>>> However for me, this caused the following bootstrap failure:
>>>
>>> In file included from /workdir/src/gcc-10.0.0/gcc/cp/cp-lang.c:24:
>>> /workdir/src/gcc-10.0.0/gcc/cp/cp-tree.h: In function 'tree_node*
>>> template_info_decl_check(const_tree, const char*, int, const char*)':
>>> /workdir/src/gcc-10.0.0/gcc/cp/cp-tree.h:3368:3: error:
>>> 'tree_check_failed' was not declared in this scope
>>>    tree_check_failed (t, f, l, fn,
>>>    ^~~~~~~~~~~~~~~~~
>>> /workdir/src/gcc-10.0.0/gcc/cp/cp-tree.h:3368:3: note: suggested
>>> alternative: 'vec_check_alloc'
>>>    tree_check_failed (t, f, l, fn,
>>>    ^~~~~~~~~~~~~~~~~
>>>    vec_check_alloc
>>> make[2]: *** [Makefile:1118: cp/cp-lang.o] Error 1
>>>
>>>
>> On arm, this is causing:
>>  FAIL: g++.dg/ext/arm-fp16/arm-fp16-ops-1.C  -std=gnu++2a (test for
>> excess errors)
>> Excess errors:
>> /gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h:31:10: warning: '++'
>> expression of 'volatile'-qualified type is deprecated [-Wvolatile]
>>
>
> These would be due to
>
> 2019-08-28  Marek Polacek  <polacek@redhat.com>
>
>         Implement P1152R4: Deprecating some uses of volatile.
>         PR c++/91361
>         * cp-gimplify.c (cp_fold): Set TREE_THIS_VOLATILE.
>         * decl.c (grokdeclarator): Warn about a volatile-qualified
> structured
>         binding and return type.
>         (grokparms): Warn about a volatile-qualified function parameter.
>         * expr.c (mark_use) <case MODIFY_EXPR>: Emit a -Wvolatile warning.
>         * typeck.c (cp_build_unary_op): Emit a -Wvolatile warning for pre
> and
>         post ++/-- on a volatile operand.
>         (genericize_compound_lvalue): Use a better location.  Don't lose
>         TREE_THIS_VOLATILE.
>         (cp_build_modify_expr): Emit a -Wvolatile warning for a compound
>         assignment whose LHS is volatile-qualified.  Build the assignment
> with
>         a more precise location.
>
>
You are probably right. I replied here because gisect flagged your patch.


> and not the concepts merge.  You probably want to turn off -Wvolatile for
> affected tests.
>
Isn't the warning valid in this case? (ie. shouldn't we fix arm-fp16-ops.h
instead?)


>
>  and also:
>
>> FAIL: g++.dg/cpp2a/constexpr-dtor3.C  -std=c++2a (test for excess errors)
>> Excess errors:
>> /gcc/testsuite/g++.dg/cpp2a/constexpr-dtor3.C:152:12:   in 'constexpr'
>> expansion of '(& w13)->W7::~W7()'
>>
>
> This also seems unrelated, but I'll take a look.
>
> Thanks, I must confess I didn't bisect for this one. It appeared in the
same range of commits
as the other regressions above: between r276750 and r276786 included.

Thanks

Christophe



> Jason
>
>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH] Fix constexpr-dtor3.C FAIL on arm
  2019-10-10 21:45     ` Jason Merrill
  2019-10-11  8:19       ` Christophe Lyon
@ 2019-10-11  8:33       ` Jakub Jelinek
  2019-10-11 20:18         ` Jason Merrill
  1 sibling, 1 reply; 12+ messages in thread
From: Jakub Jelinek @ 2019-10-11  8:33 UTC (permalink / raw)
  To: Jason Merrill
  Cc: Christophe Lyon, Romain Geissler, gcc-patches List, Andrew Sutton

On Thu, Oct 10, 2019 at 05:38:21PM -0400, Jason Merrill wrote:
> > FAIL: g++.dg/cpp2a/constexpr-dtor3.C  -std=c++2a (test for excess errors)
> > Excess errors:
> > /gcc/testsuite/g++.dg/cpp2a/constexpr-dtor3.C:152:12:   in 'constexpr'
> > expansion of '(& w13)->W7::~W7()'
> >
> 
> This also seems unrelated, but I'll take a look.

This is solely a location_t difference, comparing x86_64 and arm output
 constexpr-dtor3.C: At global scope:
 constexpr-dtor3.C:156:23:   in ‘constexpr’ expansion of ‘f4()’
-constexpr-dtor3.C:156:24:   in ‘constexpr’ expansion of ‘(& w13)->W7::~W7()’
+constexpr-dtor3.C:152:12:   in ‘constexpr’ expansion of ‘(& w13)->W7::~W7()’
 constexpr-dtor3.C:88:34: error: inline assembly is not a constant expression
    88 |   constexpr ~W7 () { if (w == 5) asm (""); w = 3; } // { dg-error "inline assembly is not a constant expression" }
       |                                  ^~~
 constexpr-dtor3.C:88:34: note: only unevaluated inline assembly is allowed in a ‘constexpr’ function in C++2a

constexpr int
f4 ()
{
  W7 w13 = 5;
  return 0;
}

constexpr int x4 = f4 ();       // { dg-message "in 'constexpr' expansion of" }

Line 152 is the W7 w13 = 5; line, line 156 the x4 = f4 () line.
From warning POV, the arm locations are nicer, but see below.

The difference is in cxx_maybe_build_cleanup:

  /* build_delete sets the location of the destructor call to the
     current location, even though the destructor is going to be
     called later, at the end of the current scope.  This can lead to
     a "jumpy" behavior for users of debuggers when they step around
     the end of the block.  So let's unset the location of the
     destructor call instead.  */
  protected_set_expr_location (cleanup, UNKNOWN_LOCATION);

On x86_64 and most other targets, cleanup here (if non-NULL) is the
CALL_EXPR, as destructor return type is void, but on arm, as the dtor return
type is some pointer, the CALL_EXPR is wrapped into a NOP_EXPR to void.
protected_set_expr_location then on x86_64 clears the CALL_EXPR location,
but on arm only NOP_EXPR location.

The following patch (totally untested) should fix that.

For the warning location, perhaps we could special case destructor calls
in push_cx_call_context (to offset the intentional clearing of location for
debugging purposes), if they don't have location set, don't use
input_location for them, but try to pick DECL_SOURCE_LOCATION for the
variable being destructed?

2019-10-11  Jakub Jelinek  <jakub@redhat.com>

	* decl.c (cxx_maybe_build_cleanup): When clearing location of cleanup,
	if cleanup is a nop, clear location of its operand too.

--- gcc/cp/decl.c.jj	2019-10-10 01:33:38.154943945 +0200
+++ gcc/cp/decl.c	2019-10-11 10:09:24.321277942 +0200
@@ -16864,6 +16864,8 @@ cxx_maybe_build_cleanup (tree decl, tsub
      the end of the block.  So let's unset the location of the
      destructor call instead.  */
   protected_set_expr_location (cleanup, UNKNOWN_LOCATION);
+  if (cleanup && CONVERT_EXPR_P (cleanup))
+    protected_set_expr_location (TREE_OPERAND (cleanup, 0), UNKNOWN_LOCATION);
 
   if (cleanup
       && DECL_P (decl)


	Jakub

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] Fix constexpr-dtor3.C FAIL on arm
  2019-10-11  8:33       ` [PATCH] Fix constexpr-dtor3.C FAIL on arm Jakub Jelinek
@ 2019-10-11 20:18         ` Jason Merrill
  2019-10-16 16:35           ` Jakub Jelinek
  0 siblings, 1 reply; 12+ messages in thread
From: Jason Merrill @ 2019-10-11 20:18 UTC (permalink / raw)
  To: Jakub Jelinek
  Cc: Christophe Lyon, Romain Geissler, gcc-patches List, Andrew Sutton

On 10/11/19 4:20 AM, Jakub Jelinek wrote:
> On Thu, Oct 10, 2019 at 05:38:21PM -0400, Jason Merrill wrote:
>>> FAIL: g++.dg/cpp2a/constexpr-dtor3.C  -std=c++2a (test for excess errors)
>>> Excess errors:
>>> /gcc/testsuite/g++.dg/cpp2a/constexpr-dtor3.C:152:12:   in 'constexpr'
>>> expansion of '(& w13)->W7::~W7()'
>>>
>>
>> This also seems unrelated, but I'll take a look.
> 
> This is solely a location_t difference, comparing x86_64 and arm output
>   constexpr-dtor3.C: At global scope:
>   constexpr-dtor3.C:156:23:   in ‘constexpr’ expansion of ‘f4()’
> -constexpr-dtor3.C:156:24:   in ‘constexpr’ expansion of ‘(& w13)->W7::~W7()’
> +constexpr-dtor3.C:152:12:   in ‘constexpr’ expansion of ‘(& w13)->W7::~W7()’
>   constexpr-dtor3.C:88:34: error: inline assembly is not a constant expression
>      88 |   constexpr ~W7 () { if (w == 5) asm (""); w = 3; } // { dg-error "inline assembly is not a constant expression" }
>         |                                  ^~~
>   constexpr-dtor3.C:88:34: note: only unevaluated inline assembly is allowed in a ‘constexpr’ function in C++2a
> 
> constexpr int
> f4 ()
> {
>    W7 w13 = 5;
>    return 0;
> }
> 
> constexpr int x4 = f4 ();       // { dg-message "in 'constexpr' expansion of" }
> 
> Line 152 is the W7 w13 = 5; line, line 156 the x4 = f4 () line.
>  From warning POV, the arm locations are nicer, but see below.
> 
> The difference is in cxx_maybe_build_cleanup:
> 
>    /* build_delete sets the location of the destructor call to the
>       current location, even though the destructor is going to be
>       called later, at the end of the current scope.  This can lead to
>       a "jumpy" behavior for users of debuggers when they step around
>       the end of the block.  So let's unset the location of the
>       destructor call instead.  */
>    protected_set_expr_location (cleanup, UNKNOWN_LOCATION);
> 
> On x86_64 and most other targets, cleanup here (if non-NULL) is the
> CALL_EXPR, as destructor return type is void, but on arm, as the dtor return
> type is some pointer, the CALL_EXPR is wrapped into a NOP_EXPR to void.
> protected_set_expr_location then on x86_64 clears the CALL_EXPR location,
> but on arm only NOP_EXPR location.
> 
> The following patch (totally untested) should fix that.
> 
> For the warning location, perhaps we could special case destructor calls
> in push_cx_call_context (to offset the intentional clearing of location for
> debugging purposes), if they don't have location set, don't use
> input_location for them, but try to pick DECL_SOURCE_LOCATION for the
> variable being destructed?

Expanding the CLEANUP_EXPR of a CLEANUP_STMT could use the EXPR_LOCATION 
of the CLEANUP_STMT.  Or the EXPR_LOCATION of *jump_target, if suitable.

Jason

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] Fix constexpr-dtor3.C FAIL on arm
  2019-10-11 20:18         ` Jason Merrill
@ 2019-10-16 16:35           ` Jakub Jelinek
  2019-10-16 20:36             ` Jason Merrill
  2019-10-16 21:03             ` Jason Merrill
  0 siblings, 2 replies; 12+ messages in thread
From: Jakub Jelinek @ 2019-10-16 16:35 UTC (permalink / raw)
  To: Jason Merrill
  Cc: Christophe Lyon, Romain Geissler, gcc-patches List, Andrew Sutton

[-- Attachment #1: Type: text/plain, Size: 2536 bytes --]

On Fri, Oct 11, 2019 at 04:14:16PM -0400, Jason Merrill wrote:
> > On x86_64 and most other targets, cleanup here (if non-NULL) is the
> > CALL_EXPR, as destructor return type is void, but on arm, as the dtor return
> > type is some pointer, the CALL_EXPR is wrapped into a NOP_EXPR to void.
> > protected_set_expr_location then on x86_64 clears the CALL_EXPR location,
> > but on arm only NOP_EXPR location.
> > 
> > The following patch (totally untested) should fix that.
> > 
> > For the warning location, perhaps we could special case destructor calls
> > in push_cx_call_context (to offset the intentional clearing of location for
> > debugging purposes), if they don't have location set, don't use
> > input_location for them, but try to pick DECL_SOURCE_LOCATION for the
> > variable being destructed?
> 
> Expanding the CLEANUP_EXPR of a CLEANUP_STMT could use the EXPR_LOCATION of
> the CLEANUP_STMT.  Or the EXPR_LOCATION of *jump_target, if suitable.

The already previously posted patch (now attached as first) has now been
bootstrapped/regtested on x86_64-linux and i686-linux, and regardless if we
improve the location or not should fix the arm vs. the rest of the world
difference.  Is that ok for trunk?

As for CLEANUP_STMT, I've tried it (the second patch), but it didn't change
anything, the diagnostics was still
constexpr-dtor3.C:16:23:   in ‘constexpr’ expansion of ‘f4()’
constexpr-dtor3.C:16:24:   in ‘constexpr’ expansion of ‘(& w13)->W7::~W7()’
constexpr-dtor3.C:5:34: error: inline assembly is not a constant expression
    5 |   constexpr ~W7 () { if (w == 5) asm (""); w = 3; } // { dg-error "inline assembly is not a constant expression" }
      |                                  ^~~
constexpr-dtor3.C:5:34: note: only unevaluated inline assembly is allowed in a ‘constexpr’ function in C++2a
as without that change.

I've also tried the third patch, tested so far with check-c++-all, which
changes that to
constexpr-dtor3.C:16:23:   in ‘constexpr’ expansion of ‘f4()’
constexpr-dtor3.C:12:6:   in ‘constexpr’ expansion of ‘(& w13)->W7::~W7()’
constexpr-dtor3.C:5:34: error: inline assembly is not a constant expression
    5 |   constexpr ~W7 () { if (w == 5) asm (""); w = 3; } // { dg-error "inline assembly is not a constant expression" }
      |                                  ^~~
constexpr-dtor3.C:5:34: note: only unevaluated inline assembly is allowed in a ‘constexpr’ function in C++2a

	Jakub

[-- Attachment #2: T973a --]
[-- Type: text/plain, Size: 677 bytes --]

2019-10-16  Jakub Jelinek  <jakub@redhat.com>

	* decl.c (cxx_maybe_build_cleanup): When clearing location of cleanup,
	if cleanup is a nop, clear location of its operand too.

--- gcc/cp/decl.c.jj	2019-10-10 01:33:38.154943945 +0200
+++ gcc/cp/decl.c	2019-10-11 10:09:24.321277942 +0200
@@ -16864,6 +16864,8 @@ cxx_maybe_build_cleanup (tree decl, tsub
      the end of the block.  So let's unset the location of the
      destructor call instead.  */
   protected_set_expr_location (cleanup, UNKNOWN_LOCATION);
+  if (cleanup && CONVERT_EXPR_P (cleanup))
+    protected_set_expr_location (TREE_OPERAND (cleanup, 0), UNKNOWN_LOCATION);
 
   if (cleanup
       && DECL_P (decl)

[-- Attachment #3: T973b --]
[-- Type: text/plain, Size: 892 bytes --]

2019-10-16  Jakub Jelinek  <jakub@redhat.com>

	* constexpr.c (cxx_eval_constant_expression) <case CLEANUP_STMT>:
	Temporarily change input_location to CLEANUP_STMT location.

--- gcc/cp/constexpr.c.jj	2019-10-10 01:33:38.185943480 +0200
+++ gcc/cp/constexpr.c	2019-10-11 22:54:32.628051700 +0200
@@ -4980,9 +4980,13 @@ cxx_eval_constant_expression (const cons
     case CLEANUP_STMT:
       {
 	tree initial_jump_target = jump_target ? *jump_target : NULL_TREE;
+	location_t loc = input_location;
+	if (EXPR_HAS_LOCATION (t))
+	  input_location = EXPR_LOCATION (t);
 	r = cxx_eval_constant_expression (ctx, CLEANUP_BODY (t), lval,
 					  non_constant_p, overflow_p,
 					  jump_target);
+	input_location = loc;
 	if (!CLEANUP_EH_ONLY (t) && !*non_constant_p)
 	  /* Also evaluate the cleanup.  If we weren't skipping at the
 	     start of the CLEANUP_BODY, change jump_target temporarily

[-- Attachment #4: T973c --]
[-- Type: text/plain, Size: 2370 bytes --]

2019-10-16  Jakub Jelinek  <jakub@redhat.com>

	* decl.c (cxx_maybe_build_cleanup): When clearing location of cleanup,
	if cleanup is a nop, clear location of its operand too.
	* constexpr.c (push_cx_call_context): For calls to destructors, use
	DECL_SOURCE_LOCATION of destructed variable in preference to
	input_location.

	* g++.dg/cpp2a/constexpr-dtor3.C: Expect in 'constexpr' expansion of
	message on the line with variable declaration.

--- gcc/cp/decl.c.jj	2019-10-16 09:30:57.490109872 +0200
+++ gcc/cp/decl.c	2019-10-16 17:45:48.647529567 +0200
@@ -16864,6 +16864,8 @@ cxx_maybe_build_cleanup (tree decl, tsub
      the end of the block.  So let's unset the location of the
      destructor call instead.  */
   protected_set_expr_location (cleanup, UNKNOWN_LOCATION);
+  if (cleanup && CONVERT_EXPR_P (cleanup))
+    protected_set_expr_location (TREE_OPERAND (cleanup, 0), UNKNOWN_LOCATION);
 
   if (cleanup
       && DECL_P (decl)
--- gcc/cp/constexpr.c.jj	2019-10-16 17:35:37.848752468 +0200
+++ gcc/cp/constexpr.c	2019-10-16 18:07:42.472688066 +0200
@@ -1457,7 +1457,26 @@ push_cx_call_context (tree call)
 {
   ++call_stack_tick;
   if (!EXPR_HAS_LOCATION (call))
-    SET_EXPR_LOCATION (call, input_location);
+    {
+      tree fun = get_function_named_in_call (call);
+      location_t loc = input_location;
+      /* Calls to destructors have UNKNOWN_LOCATION, in order to avoid
+	 problems debugging at the end of scopes.  For diagnostic purposes,
+	 try to use location of the variable that needs destruction.  */
+      if (fun && DECL_DESTRUCTOR_P (fun))
+	{
+	  tree arg = CALL_EXPR_ARG (call, 0);
+	  STRIP_NOPS (arg);
+	  if (TREE_CODE (arg) == ADDR_EXPR)
+	    {
+	      tree var = get_base_address (TREE_OPERAND (arg, 0));
+	      if (DECL_P (var)
+		  && DECL_SOURCE_LOCATION (var) != UNKNOWN_LOCATION)
+		loc = DECL_SOURCE_LOCATION (var);
+	    }
+	}
+      SET_EXPR_LOCATION (call, loc);
+    }
   call_stack.safe_push (call);
   int len = call_stack.length ();
   if (len > max_constexpr_depth)
--- gcc/testsuite/g++.dg/cpp2a/constexpr-dtor3.C.jj	2019-10-05 09:36:39.250674497 +0200
+++ gcc/testsuite/g++.dg/cpp2a/constexpr-dtor3.C	2019-10-16 18:10:48.603877004 +0200
@@ -149,7 +149,7 @@ constexpr int x3 = f3 ();
 constexpr int
 f4 ()
 {
-  W7 w13 = 5;
+  W7 w13 = 5;			// { dg-message "in 'constexpr' expansion of" }
   return 0;
 }
 

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] Fix constexpr-dtor3.C FAIL on arm
  2019-10-16 16:35           ` Jakub Jelinek
@ 2019-10-16 20:36             ` Jason Merrill
  2019-10-16 21:03             ` Jason Merrill
  1 sibling, 0 replies; 12+ messages in thread
From: Jason Merrill @ 2019-10-16 20:36 UTC (permalink / raw)
  To: Jakub Jelinek
  Cc: Christophe Lyon, Romain Geissler, gcc-patches List, Andrew Sutton

On 10/16/19 12:27 PM, Jakub Jelinek wrote:
> On Fri, Oct 11, 2019 at 04:14:16PM -0400, Jason Merrill wrote:
>>> On x86_64 and most other targets, cleanup here (if non-NULL) is the
>>> CALL_EXPR, as destructor return type is void, but on arm, as the dtor return
>>> type is some pointer, the CALL_EXPR is wrapped into a NOP_EXPR to void.
>>> protected_set_expr_location then on x86_64 clears the CALL_EXPR location,
>>> but on arm only NOP_EXPR location.
>>>
>>> The following patch (totally untested) should fix that.
>>>
>>> For the warning location, perhaps we could special case destructor calls
>>> in push_cx_call_context (to offset the intentional clearing of location for
>>> debugging purposes), if they don't have location set, don't use
>>> input_location for them, but try to pick DECL_SOURCE_LOCATION for the
>>> variable being destructed?
>>
>> Expanding the CLEANUP_EXPR of a CLEANUP_STMT could use the EXPR_LOCATION of
>> the CLEANUP_STMT.  Or the EXPR_LOCATION of *jump_target, if suitable.
> 
> The already previously posted patch (now attached as first) has now been
> bootstrapped/regtested on x86_64-linux and i686-linux, and regardless if we
> improve the location or not should fix the arm vs. the rest of the world
> difference.  Is that ok for trunk?

OK.

> As for CLEANUP_STMT, I've tried it (the second patch), but it didn't change
> anything, the diagnostics was still
> constexpr-dtor3.C:16:23:   in ‘constexpr’ expansion of ‘f4()’
> constexpr-dtor3.C:16:24:   in ‘constexpr’ expansion of ‘(& w13)->W7::~W7()’
> constexpr-dtor3.C:5:34: error: inline assembly is not a constant expression
>      5 |   constexpr ~W7 () { if (w == 5) asm (""); w = 3; } // { dg-error "inline assembly is not a constant expression" }
>        |                                  ^~~
> constexpr-dtor3.C:5:34: note: only unevaluated inline assembly is allowed in a ‘constexpr’ function in C++2a
> as without that change.

That's because the patch changes EXPR_LOCATION for evaluation of the 
CLEANUP_BODY, but it should be for evaluation of CLEANUP_EXPR instead.

Jason

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] Fix constexpr-dtor3.C FAIL on arm
  2019-10-16 16:35           ` Jakub Jelinek
  2019-10-16 20:36             ` Jason Merrill
@ 2019-10-16 21:03             ` Jason Merrill
  2019-10-17 22:57               ` Jakub Jelinek
  1 sibling, 1 reply; 12+ messages in thread
From: Jason Merrill @ 2019-10-16 21:03 UTC (permalink / raw)
  To: Jakub Jelinek
  Cc: Christophe Lyon, Romain Geissler, gcc-patches List, Andrew Sutton

On 10/16/19 12:27 PM, Jakub Jelinek wrote:
> On Fri, Oct 11, 2019 at 04:14:16PM -0400, Jason Merrill wrote:
>>> On x86_64 and most other targets, cleanup here (if non-NULL) is the
>>> CALL_EXPR, as destructor return type is void, but on arm, as the dtor return
>>> type is some pointer, the CALL_EXPR is wrapped into a NOP_EXPR to void.
>>> protected_set_expr_location then on x86_64 clears the CALL_EXPR location,
>>> but on arm only NOP_EXPR location.
>>>
>>> The following patch (totally untested) should fix that.
>>>
>>> For the warning location, perhaps we could special case destructor calls
>>> in push_cx_call_context (to offset the intentional clearing of location for
>>> debugging purposes), if they don't have location set, don't use
>>> input_location for them, but try to pick DECL_SOURCE_LOCATION for the
>>> variable being destructed?
>>
>> Expanding the CLEANUP_EXPR of a CLEANUP_STMT could use the EXPR_LOCATION of
>> the CLEANUP_STMT.  Or the EXPR_LOCATION of *jump_target, if suitable.
>
> The already previously posted patch (now attached as first) has now been
> bootstrapped/regtested on x86_64-linux and i686-linux, and regardless if we
> improve the location or not should fix the arm vs. the rest of the world
> difference.  Is that ok for trunk?

OK.

> As for CLEANUP_STMT, I've tried it (the second patch), but it didn't change
> anything, the diagnostics was still
> constexpr-dtor3.C:16:23:   in ‘constexpr’ expansion of ‘f4()’
> constexpr-dtor3.C:16:24:   in ‘constexpr’ expansion of ‘(& w13)->W7::~W7()’
> constexpr-dtor3.C:5:34: error: inline assembly is not a constant expression
>      5 |   constexpr ~W7 () { if (w == 5) asm (""); w = 3; } // { dg-error "inline assembly is not a constant expression" }
>        |                                  ^~~
> constexpr-dtor3.C:5:34: note: only unevaluated inline assembly is allowed in a ‘constexpr’ function in C++2a
> as without that change.

That's because the patch changes EXPR_LOCATION for evaluation of the
CLEANUP_BODY, but it should be for evaluation of CLEANUP_EXPR instead.


Jason

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] Fix constexpr-dtor3.C FAIL on arm
  2019-10-16 21:03             ` Jason Merrill
@ 2019-10-17 22:57               ` Jakub Jelinek
  2019-10-22 20:55                 ` Jason Merrill
  0 siblings, 1 reply; 12+ messages in thread
From: Jakub Jelinek @ 2019-10-17 22:57 UTC (permalink / raw)
  To: Jason Merrill
  Cc: Christophe Lyon, Romain Geissler, gcc-patches List, Andrew Sutton

On Wed, Oct 16, 2019 at 04:36:07PM -0400, Jason Merrill wrote:
> > As for CLEANUP_STMT, I've tried it (the second patch), but it didn't change
> > anything, the diagnostics was still
> > constexpr-dtor3.C:16:23:   in ‘constexpr’ expansion of ‘f4()’
> > constexpr-dtor3.C:16:24:   in ‘constexpr’ expansion of ‘(& w13)->W7::~W7()’
> > constexpr-dtor3.C:5:34: error: inline assembly is not a constant expression
> >      5 |   constexpr ~W7 () { if (w == 5) asm (""); w = 3; } // { dg-error "inline assembly is not a constant expression" }
> >        |                                  ^~~
> > constexpr-dtor3.C:5:34: note: only unevaluated inline assembly is allowed in a ‘constexpr’ function in C++2a
> > as without that change.
> 
> That's because the patch changes EXPR_LOCATION for evaluation of the
> CLEANUP_BODY, but it should be for evaluation of CLEANUP_EXPR instead.

Indeed, that works too.  Bootstrapped/regtested on x86_64-linux and
i686-linux, ok for trunk?

2019-10-18  Jakub Jelinek  <jakub@redhat.com>

	* constexpr.c (cxx_eval_constant_expression) <case CLEANUP_STMT>:
	Temporarily change input_location to CLEANUP_STMT location.

	* g++.dg/cpp2a/constexpr-dtor3.C: Expect in 'constexpr' expansion of
	message on the line with variable declaration.
	* g++.dg/ext/constexpr-attr-cleanup1.C: Likewise.

--- gcc/cp/constexpr.c.jj	2019-10-17 00:15:50.126726231 +0200
+++ gcc/cp/constexpr.c	2019-10-17 11:21:34.400062565 +0200
@@ -4984,14 +4984,20 @@ cxx_eval_constant_expression (const cons
 					  non_constant_p, overflow_p,
 					  jump_target);
 	if (!CLEANUP_EH_ONLY (t) && !*non_constant_p)
-	  /* Also evaluate the cleanup.  If we weren't skipping at the
-	     start of the CLEANUP_BODY, change jump_target temporarily
-	     to &initial_jump_target, so that even a return or break or
-	     continue in the body doesn't skip the cleanup.  */
-	  cxx_eval_constant_expression (ctx, CLEANUP_EXPR (t), true,
-					non_constant_p, overflow_p,
-					jump_target ? &initial_jump_target
-					: NULL);
+	  {
+	    location_t loc = input_location;
+	    if (EXPR_HAS_LOCATION (t))
+	      input_location = EXPR_LOCATION (t);
+	    /* Also evaluate the cleanup.  If we weren't skipping at the
+	       start of the CLEANUP_BODY, change jump_target temporarily
+	       to &initial_jump_target, so that even a return or break or
+	       continue in the body doesn't skip the cleanup.  */
+	    cxx_eval_constant_expression (ctx, CLEANUP_EXPR (t), true,
+					  non_constant_p, overflow_p,
+					  jump_target ? &initial_jump_target
+					  : NULL);
+	    input_location = loc;
+	  }
       }
       break;
 
--- gcc/testsuite/g++.dg/cpp2a/constexpr-dtor3.C.jj	2019-10-17 00:15:49.425736657 +0200
+++ gcc/testsuite/g++.dg/cpp2a/constexpr-dtor3.C	2019-10-17 11:20:13.977290046 +0200
@@ -149,7 +149,7 @@ constexpr int x3 = f3 ();
 constexpr int
 f4 ()
 {
-  W7 w13 = 5;
+  W7 w13 = 5;			// { dg-message "in 'constexpr' expansion of" }
   return 0;
 }
 
--- gcc/testsuite/g++.dg/ext/constexpr-attr-cleanup1.C.jj	2019-10-03 00:32:15.604526950 +0200
+++ gcc/testsuite/g++.dg/ext/constexpr-attr-cleanup1.C	2019-10-18 00:18:50.248166117 +0200
@@ -15,7 +15,7 @@ cleanup2 (int *x)
 constexpr bool
 foo ()
 {
-  int a __attribute__((cleanup (cleanup))) = 1;
+  int a __attribute__((cleanup (cleanup))) = 1;	// { dg-message "in 'constexpr' expansion of" }
   return true;
 }
 


	Jakub

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] Fix constexpr-dtor3.C FAIL on arm
  2019-10-17 22:57               ` Jakub Jelinek
@ 2019-10-22 20:55                 ` Jason Merrill
  0 siblings, 0 replies; 12+ messages in thread
From: Jason Merrill @ 2019-10-22 20:55 UTC (permalink / raw)
  To: Jakub Jelinek
  Cc: Christophe Lyon, Romain Geissler, gcc-patches List, Andrew Sutton

On Thu, Oct 17, 2019 at 6:22 PM Jakub Jelinek <jakub@redhat.com> wrote:
>
> On Wed, Oct 16, 2019 at 04:36:07PM -0400, Jason Merrill wrote:
> > > As for CLEANUP_STMT, I've tried it (the second patch), but it didn't change
> > > anything, the diagnostics was still
> > > constexpr-dtor3.C:16:23:   in ‘constexpr’ expansion of ‘f4()’
> > > constexpr-dtor3.C:16:24:   in ‘constexpr’ expansion of ‘(& w13)->W7::~W7()’
> > > constexpr-dtor3.C:5:34: error: inline assembly is not a constant expression
> > >      5 |   constexpr ~W7 () { if (w == 5) asm (""); w = 3; } // { dg-error "inline assembly is not a constant expression" }
> > >        |                                  ^~~
> > > constexpr-dtor3.C:5:34: note: only unevaluated inline assembly is allowed in a ‘constexpr’ function in C++2a
> > > as without that change.
> >
> > That's because the patch changes EXPR_LOCATION for evaluation of the
> > CLEANUP_BODY, but it should be for evaluation of CLEANUP_EXPR instead.
>
> Indeed, that works too.  Bootstrapped/regtested on x86_64-linux and
> i686-linux, ok for trunk?

OK, thanks.

> 2019-10-18  Jakub Jelinek  <jakub@redhat.com>
>
>         * constexpr.c (cxx_eval_constant_expression) <case CLEANUP_STMT>:
>         Temporarily change input_location to CLEANUP_STMT location.
>
>         * g++.dg/cpp2a/constexpr-dtor3.C: Expect in 'constexpr' expansion of
>         message on the line with variable declaration.
>         * g++.dg/ext/constexpr-attr-cleanup1.C: Likewise.
>
> --- gcc/cp/constexpr.c.jj       2019-10-17 00:15:50.126726231 +0200
> +++ gcc/cp/constexpr.c  2019-10-17 11:21:34.400062565 +0200
> @@ -4984,14 +4984,20 @@ cxx_eval_constant_expression (const cons
>                                           non_constant_p, overflow_p,
>                                           jump_target);
>         if (!CLEANUP_EH_ONLY (t) && !*non_constant_p)
> -         /* Also evaluate the cleanup.  If we weren't skipping at the
> -            start of the CLEANUP_BODY, change jump_target temporarily
> -            to &initial_jump_target, so that even a return or break or
> -            continue in the body doesn't skip the cleanup.  */
> -         cxx_eval_constant_expression (ctx, CLEANUP_EXPR (t), true,
> -                                       non_constant_p, overflow_p,
> -                                       jump_target ? &initial_jump_target
> -                                       : NULL);
> +         {
> +           location_t loc = input_location;
> +           if (EXPR_HAS_LOCATION (t))
> +             input_location = EXPR_LOCATION (t);
> +           /* Also evaluate the cleanup.  If we weren't skipping at the
> +              start of the CLEANUP_BODY, change jump_target temporarily
> +              to &initial_jump_target, so that even a return or break or
> +              continue in the body doesn't skip the cleanup.  */
> +           cxx_eval_constant_expression (ctx, CLEANUP_EXPR (t), true,
> +                                         non_constant_p, overflow_p,
> +                                         jump_target ? &initial_jump_target
> +                                         : NULL);
> +           input_location = loc;
> +         }
>        }
>        break;
>
> --- gcc/testsuite/g++.dg/cpp2a/constexpr-dtor3.C.jj     2019-10-17 00:15:49.425736657 +0200
> +++ gcc/testsuite/g++.dg/cpp2a/constexpr-dtor3.C        2019-10-17 11:20:13.977290046 +0200
> @@ -149,7 +149,7 @@ constexpr int x3 = f3 ();
>  constexpr int
>  f4 ()
>  {
> -  W7 w13 = 5;
> +  W7 w13 = 5;                  // { dg-message "in 'constexpr' expansion of" }
>    return 0;
>  }
>
> --- gcc/testsuite/g++.dg/ext/constexpr-attr-cleanup1.C.jj       2019-10-03 00:32:15.604526950 +0200
> +++ gcc/testsuite/g++.dg/ext/constexpr-attr-cleanup1.C  2019-10-18 00:18:50.248166117 +0200
> @@ -15,7 +15,7 @@ cleanup2 (int *x)
>  constexpr bool
>  foo ()
>  {
> -  int a __attribute__((cleanup (cleanup))) = 1;
> +  int a __attribute__((cleanup (cleanup))) = 1;        // { dg-message "in 'constexpr' expansion of" }
>    return true;
>  }
>
>
>
>         Jakub

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2019-10-22 20:14 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-10-09 17:28 C++ PATCH to merge concepts-cxx2a branch Jason Merrill
2019-10-10  1:56 ` Romain Geissler
2019-10-10 19:56   ` Christophe Lyon
2019-10-10 21:45     ` Jason Merrill
2019-10-11  8:19       ` Christophe Lyon
2019-10-11  8:33       ` [PATCH] Fix constexpr-dtor3.C FAIL on arm Jakub Jelinek
2019-10-11 20:18         ` Jason Merrill
2019-10-16 16:35           ` Jakub Jelinek
2019-10-16 20:36             ` Jason Merrill
2019-10-16 21:03             ` Jason Merrill
2019-10-17 22:57               ` Jakub Jelinek
2019-10-22 20:55                 ` Jason Merrill

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).