aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
AgeCommit message (Collapse)AuthorFilesLines
2020-03-27[pr84733] Fix ICE popping local scopeNathan Sidwell2-1/+7
PR c++/84733 * name-lookup.c (do_pushdecl): Look through cleanp levels.
2020-03-27c++: avoid -Wredundant-tags on a first declaration in use [PR 93824]Martin Sebor4-74/+181
-Wredundant-tags doesn't consider type declarations that are also the first uses of the type, such as in 'void f (struct S);' and issues false positives for those. According to the reported that's making it harder to use the warning to clean up LibreOffice. The attached patch extends -Wredundant-tags to avoid these false positives by relying on the same class_decl_loc_t::class2loc mapping as -Wmismatched-tags. The patch also improves the detection of both issues in template declarations. gcc/cp/ChangeLog 2020-03-27 Martin Sebor <msebor@redhat.com> PR c++/94078 PR c++/93824 PR c++/93810 * cp-tree.h (most_specialized_partial_spec): Declare. * parser.c (cp_parser_elaborated_type_specifier): Distinguish alias from declarations. (specialization_of): New function. (cp_parser_check_class_key): Move code... (class_decl_loc_t::add): ...to here. Add parameters. Avoid issuing -Wredundant-tags on first-time declarations in other declarators. Correct handling of template specializations. (class_decl_loc_t::diag_mismatched_tags): Also expect to be called when -Wredundant-tags is enabled. Use primary template or partial specialization as the guide for uses of implicit instantiations. * pt.c (most_specialized_partial_spec): Declare extern. gcc/testsuite/ChangeLog 2020-03-27 Martin Sebor <msebor@redhat.com> PR c++/94078 PR c++/93824 PR c++/93810 * g++.dg/warn/Wmismatched-tags-3.C: New test. * g++.dg/warn/Wmismatched-tags-4.C: New test. * g++.dg/warn/Wmismatched-tags-5.C: New test. * g++.dg/warn/Wmismatched-tags-6.C: New test. * g++.dg/warn/Wredundant-tags-3.C: Remove xfails. * g++.dg/warn/Wredundant-tags-6.C: New test. * g++.dg/warn/Wredundant-tags-7.C: New test.
2020-03-27c++: Fix ICE after ambiguous inline namespace reopen [PR94257]Nathan Sidwell2-12/+54
Following DR2061, 'namespace F', looks for 'F's inside inline namespaces. That can result in ambiguous lookups that we failed to diagnose early enough, leading us to push a new namespace and ICE later. Diagnose the ambiguity earlier, and then pick one. PR c++/94257 * name-lookup.c (push_namespace): Triage ambiguous lookups that contain namespaces.
2020-03-27c++: Avoid calls in non-evaluated contexts affect whether function can or ↵Jakub Jelinek2-4/+12
can't throw [PR94326] The following testcase FAILs -fcompare-debug, because if we emit a -Wreturn-local-addr warning, we tsubst decltype in order to print the warning and as that function could throw, set_flags_from_callee during that sets cp_function_chain->can_throw and later on we don't set TREE_NOTHROW on foo. While with -w or -Wno-return-local-addr, tsubst isn't called during the warning_at, cp_function_chain->can_throw is kept clear and TREE_NOTHROW is set on foo. It isn't just a matter of the warning though, in int foo (); int bar () { return sizeof (foo ()); } int baz () { return sizeof (int); } I don't really see why we should mark only baz as TREE_NOTHROW and not bar too, when neither can really throw. 2020-03-27 Jakub Jelinek <jakub@redhat.com> PR c++/94326 * call.c (set_flags_from_callee): Don't update cp_function_chain->can_throw or current_function_returns_abnormally if cp_unevaluated_operand. * g++.dg/other/pr94326.C: New test.
2020-03-27c++: Handle COMPOUND_EXPRs in ocp_convert [PR94339]Jakub Jelinek2-0/+17
My recent change to get_narrower/warnings_for_convert_and_check broke the following testcase, warnings_for_convert_and_check is upset that expr is a COMPOUND_EXPR with INTEGER_CST at the rightmost operand, while result is a COMPOUND_EXPR with a NOP_EXPR of INTEGER_CST at the rightmost operand, it expects such conversions to be simplified. The easiest fix seems to be to handle COMPOUND_EXPRs in ocp_convert too, by converting the rightmost operand and recreating COMPOUND_EXPR(s) if that changed. The attr-copy-2.C change is a workaround for PR94346, where we now ICE on the testcase, while previously we'd ICE only if it contained a comma expression at the outer level rather than cast of a COMPOUND_EXPR to something. I'll defer that to Martin. 2020-03-27 Jakub Jelinek <jakub@redhat.com> PR c++/94339 * cvt.c (ocp_convert): Handle COMPOUND_EXPR by recursion on the second operand and creating a new COMPOUND_EXPR if anything changed. * g++.dg/other/pr94339.C: New test. * g++.dg/ext/attr-copy-2.C: Comment out failing tests due to PR94346.
2020-03-26c++: template keyword accepted before destructor names [PR94336]Marek Polacek2-0/+15
This came up on the C++ core list recently. We don't diagnose the case when 'template' is followed by a destructor name which is not permitted by [temp.names]/5. PR c++/94336 - template keyword accepted before destructor names. * parser.c (cp_parser_unqualified_id): Give an error when 'template' is followed by a destructor name. * g++.dg/template/template-keyword2.C: New test.
2020-03-26c++: Remove redundant calls to type_dependent_expression_pPatrick Palka4-8/+13
This simplifies conditions that test both value_dependent_expression_p and type_dependent_expression_p, since the former predicate now subsumes the latter. gcc/cp/ChangeLog: * decl.c (compute_array_index_type_loc): Remove redundant type_dependent_expression_p check that is subsumed by value_dependent_expression_p. * decl2.c (is_late_template_attribute): Likewise. * pt.c (uses_template_parms): Likewise. (dependent_template_arg_p): Likewise.
2020-03-26c++: DR1710, template keyword in a typename-specifier [PR94057]Marek Polacek2-13/+77
Consider template <typename T> class A { template <typename U> class B { void fn(typename A<T>::B<U>); }; }; which is rejected with error: 'typename A<T>::B' names 'template<class T> template<class U> class A<T>::B', which is not a type whereas clang/icc/msvc accept it. "typename A<T>::B<U>" is a typename-specifier. Sadly, our comments don't mention it anywhere, because the typename-specifier wasn't in C++11; it was only added to the language in N1376. Instead, we handle it as an elaborated-type-specifier (not a problem thus far). So we get to cp_parser_nested_name_specifier_opt which has a loop that breaks if we don't see a < or ::, but that means we can -- tentatively -- parse even B<U> which is not a nested-name-specifier (it doesn't end with a ::). I think this should compile because [temp.names]/4 says: "In a qualified-id used as the name in a typename-specifier, elaborated-type-specifier, using-declaration, or class-or-decltype, an optional keyword template appearing at the top level is ignored.", added in DR 1710. Also see DR 1812. This issue on its own is not a significant problem or a regression. However, in C++20, the typename here becomes optional, and so this test is rejected in C++20, but accepted in C++17: template <typename T> class A { template <typename U> class B { void fn(A<T>::B<U>); }; }; Here we morph A<T>::B<U> into a typename-specifier, but that happens in cp_parser_simple_type_specifier and we never handle it as above. To fake the template keyword I'm afraid we need to use cp_parser_template_id with template_keyword_p=true as in the patch below. The tricky thing is to avoid breaking concepts. To handle DR 1710, I made cp_parser_nested_name_specifier_opt assume that when we're naming a type, the template keyword is present, too. That revealed a bug: DR 1710 also says that the template keyword can be followed by an alias template, but we weren't prepared to handle that. alias-decl?.C exercise this. gcc/cp: DR 1710 PR c++/94057 - template keyword in a typename-specifier. * parser.c (check_template_keyword_in_nested_name_spec): New. (cp_parser_nested_name_specifier_opt): Implement DR1710, optional 'template'. Call check_template_keyword_in_nested_name_spec. (cp_parser_simple_type_specifier): Assume that a < following a qualified-id in a typename-specifier begins a template argument list. gcc/testsuite: DR 1710 PR c++/94057 - template keyword in a typename-specifier. * g++.dg/cpp1y/alias-decl1.C: New test. * g++.dg/cpp1y/alias-decl2.C: New test. * g++.dg/cpp1y/alias-decl3.C: New test. * g++.dg/parse/missing-template1.C: Update dg-error. * g++.dg/parse/template3.C: Likewise. * g++.dg/template/error4.C: Likewise. * g++.dg/template/meminit2.C: Likewise. * g++.dg/template/dependent-name5.C: Likewise. * g++.dg/template/dependent-name7.C: New test. * g++.dg/template/dependent-name8.C: New test. * g++.dg/template/dependent-name9.C: New test. * g++.dg/template/dependent-name10.C: New test. * g++.dg/template/dependent-name11.C: New test. * g++.dg/template/dependent-name12.C: New test. * g++.dg/template/dependent-name13.C: New test. * g++.dg/template/dr1794.C: New test. * g++.dg/template/dr314.C: New test. * g++.dg/template/dr1710.C: New test. * g++.dg/template/dr1710-2.C: New test. * g++.old-deja/g++.pt/crash38.C: Update dg-error.
2020-03-26coroutines: Implement n4849 recommended symmetric transfer.Iain Sandoe2-132/+110
Although the note in the text [expr.await] / 5.1.1 is not normative, it is asserted by users that an implementation that is unable to perform unlimited symmetric transfers is not terribly useful. This relates to the following circumstance: try { users-function-body: { .... { some suspend context continuation_handle = await_suspend (another handle); continuation_handle.resume (); 'return' (actually a suspension operation). } } } catch (...) {} The call to 'continuation_handle.resume ()' needs to be a tail- call in order that an arbitrary number of coroutines can be handled in this manner. There are two issues with this: 1. That the user's function body is wrapped in a try/catch block and one cannot tail-call from within those. 2. That GCC doesn't usually produce tail-calls when the optimisation level is < O2. After considerable discussion at WG21 meetings, it has been determined that the intent is that the operation behaves as if the resume call is executed in the context of the caller. So, we can remap the fragment above like this: { void_coroutine_handle continuation; try { users-function-body: { .... { some suspend context continuation = await_suspend (another handle); <scope exit without cleanup> symmetric_transfer; } } } catch (...) {} symmetric_transfer: continuation.resume(); [tail call] [must tail call] } Thus we take the call outside the try-catch block which solves issue (1) and mark it as a tail call and as "must tail call" for correctness which solves (2). As bonuses, since we no longer need to differentiate handle types returned from await_suspend() methods, nor do we need to keep them in the coroutine frame, since they are ephemeral, we save entries in the frame and reduce some code too. gcc/cp/ChangeLog: 2020-03-26 Iain Sandoe <iain@sandoe.co.uk> * coroutines.cc (coro_init_identifiers): Initialize an identifier for the cororoutine handle 'address' method name. (struct coro_aw_data): Add fields to cover the continuations. (co_await_expander): Determine the kind of await_suspend in use. If we have the case that returns a continuation handle, then save this and make the target for 'scope exit without cleanup' be the continuation resume label. (expand_co_awaits): Remove. (struct suspend_point_info): Remove fields that kept the returned await_suspend handle type. (transform_await_expr): Remove code tracking continuation handles. (build_actor_fn): Add the continuation handle as an actor-function scope var. Build the symmetric transfer continuation point. Call the tree walk for co_await expansion directly, rather than via a trivial shim function. (register_await_info): Remove fields tracking continuation handles. (get_await_suspend_return_type): Remove. (register_awaits): Remove code tracking continuation handles. (morph_fn_to_coro): Remove code tracking continuation handles. gcc/testsuite/ChangeLog: 2020-03-26 Iain Sandoe <iain@sandoe.co.uk> * g++.dg/coroutines/torture/co-ret-09-bool-await-susp.C: Amend to n4849 behaviour. * g++.dg/coroutines/torture/symmetric-transfer-00-basic.C: New test.
2020-03-26coroutines: Implement n4849 changes to exception handling.Iain Sandoe2-5/+102
The standard now calls up a revised mechanism to handle exceptions where exceptions thrown by the await_resume () method of the initial suspend expression are considered in the same manner as exceptions thrown by the user-authored function body. This implements [dcl.fct.def.coroutine] / 5.3. gcc/cp/ChangeLog: 2020-03-26 Iain Sandoe <iain@sandoe.co.uk> * coroutines.cc (co_await_expander): If we are expanding the initial await expression, set a boolean flag to show that we have now reached the initial await_resume() method call. (expand_co_awaits): Handle the 'initial await resume called' flag. (build_actor_fn): Insert the initial await expression into the start of the user-authored function-body. Handle the 'initial await resume called' flag. (morph_fn_to_coro): Initialise the 'initial await resume called' flag. Modify the unhandled exception catch clause to recognise exceptions that occur before the initial await_resume() and re- throw them. gcc/testsuite/ChangeLog: 2020-03-26 Iain Sandoe <iain@sandoe.co.uk> * g++.dg/coroutines/torture/exceptions-test-01-n4849-a.C: New test.
2020-03-26c++: Fix up user_provided_p [PR81349]Jakub Jelinek2-6/+8
The standard says: "A function is user-provided if it is user-declared and not explicitly defaulted or deleted on its first declaration." I don't see anything about function templates having different rules here, but user_provided_p does return true for all TEMPLATE_DECLs. The following patch fixes it by treating as user-provided only templates that aren't deleted. 2020-03-26 Jakub Jelinek <jakub@redhat.com> PR c++/81349 * class.c (user_provided_p): Use STRIP_TEMPLATE instead of returning true for all TEMPLATE_DECLs. * g++.dg/cpp1z/pr81349.C: New test.
2020-03-26c++: Fix a -fcompare-debug issue with DEBUG_BEGIN_STMT stmts in ↵Jakub Jelinek2-0/+34
STATEMENT_LISTs [PR94272] The following testcase FAILs with -fcompare-debug. The problem is that the C++ FE initially uses IF_STMTs, tcc_statement which default to TREE_SIDE_EFFECTS set, but later on is genericized into COND_EXPRs, tcc_expression which default to TREE_SIDE_EFFECTS ored from all 3 operands. Furthermore, with -g we emit by default DEBUG_BEGIN_STMTs (TREE_SIDE_EFFECTS clear) and so end up with a STATEMENT_LIST containing DEBUG_BEGIN_STMT + e.g. the IF_STMT, while with -g0 we would end up with just the IF_STMT alone and in that case there is no STATEMENT_LIST wrapping it. Now, the STATEMENT_LIST has TREE_SIDE_EFFECTS set to match the IF_STMT, but if none of the 3 operands (condition and both branches) have TREE_SIDE_EFFECTS, genericize_if_stmt will replace the IF_STMT with COND_EXPR without TREE_SIDE_EFFECTS, but with -g only STATEMENT_LIST wrapping it will keep TREE_SIDE_EFFECTS. Then during gimplification, shortcut_cond_expr checks TREE_SIDE_EFFECTS of the operands and as it is differennt between -g and -g0, will generate different code. The following patch attempts to fix this by clearing TREE_SIDE_EFFECTS on STATEMENT_LISTs that initially have it set and contain only DEBUG_BEGIN_STMT or at most one other statement that lost TREE_SIDE_EFFECTS during the genericization. 2020-03-26 Jakub Jelinek <jakub@redhat.com> PR c++/94272 * cp-gimplify.c (cp_genericize_r): Handle STATEMENT_LIST. * g++.dg/debug/pr94272.C: New test.
2020-03-25c++: Fix invalid -Wduplicated-cond warning [PR94265]Patrick Palka2-0/+14
This fixes a false-positive warning from -Wduplicate-cond in the presence of an if-statement with a non-empty init-statement. Precisely determining whether a non-empty init-statement has side effects seems tricky and error-prone, so this patch takes the route of unconditionally invalidating the condition chain when it encounters such an if-statement. gcc/cp/ChangeLog: PR c++/94265 * parser.c (cp_parser_selection_statement) <case RID_IF>: Invalidate the current condition chain when the if-statement has a non-empty init-statement. gcc/testsuite/ChangeLog: PR c++/94265 * g++.dg/warn/Wduplicated-cond1.C: New test.
2020-03-25coroutines: Fix missing dereference (PR94319).Iain Sandoe2-1/+6
Fix a typo. gcc/cp/ChangeLog: 2020-03-25 Iain Sandoe <iain@sandoe.co.uk> PR c++/94319 * coroutines.cc (captures_temporary): Fix a missing dereference.
2020-03-24c++: Fix wrong no post-decrement operator error in template [PR94190]Marek Polacek2-1/+9
Now that convert_like creates an IMPLICIT_CONV_EXPR when it converts something that involves a class in a template, we must be prepared to handle it. In this test, we have a class S and we're converting it to long int& using a user-defined conversion since we're performing -- on it. So cp_build_unary_op/POSTDECREMENT_EXPR calls build_expr_type_conversion which gets the IMPLICIT_CONV_EXPR. Before the convert_like change it got *S::operator long int &(&b) whose type is long int but now it gets IMPLICIT_CONV_EXPR<long int&>(b) whose type is a reference type. But the !MAYBE_CLASS_TYPE_P switch doesn't handle reference types and so we complain. Fixed by calling convert_from_reference on the result of convert_like. PR c++/94190 - wrong no post-decrement operator error in template. * call.c (convert_like_real): Use convert_from_reference on the result. * g++.dg/conversion/op7.C: New test.
2020-03-24c++: Improve handling of ill-formed constraints [PR94186].Jason Merrill2-22/+67
It would have been trivial to make the error for non-bool constraint in satisfy_atom unconditional, but that didn't give context for the error or printing with the dependent form and template arguments. So I changed a couple of places so that, when a hard error is encountered during quiet substitution/satisfaction, we go through again noisily; this builds up the necessary context. The similar change to tsubst_nested_requirement does not build up the necessary context; rather than try to fix that now I changed get_constraint_error_location to give up and use input_location if there's no CONSTR_CONTEXT. In the case of concepts-pr67697.C, we still have a good source location because the NESTED_REQ has a correct EXPR_LOCATION, but this patch doesn't improve context printing for this case as it does for the above. gcc/cp/ChangeLog 2020-03-24 Jason Merrill <jason@redhat.com> PR c++/94186 * constraint.cc (constraint_satisfaction_value): Repeat noisily on error. (tsubst_nested_requirement): Likewise. (get_constraint_error_location): Allow missing context. (diagnose_atomic_constraint): Diagnose non-bool constraint here. (satisfy_atom): Not here. Only diagnose non-constant when noisy.
2020-03-24c++: Fix template parm with dependent type in concepts.Jason Merrill2-0/+6
While looking at PR94186 I also noticed this regression; if a non-type template parameter uses a type parameter in its type, we need to map both template parameters. gcc/cp/ChangeLog 2020-03-24 Jason Merrill <jason@redhat.com> * pt.c (any_template_parm_r): Look into the type of a non-type template parm.
2020-03-24c++: Give more expressions locations.Jason Merrill2-1/+9
In the testcase for PR94186, we have a SCOPE_REF with no location even though at one point it was in a cp_expr which had a location. So let's make the cp_expr constructor that takes a location apply it to the expression when possible. gcc/cp/ChangeLog 2020-03-24 Jason Merrill <jason@redhat.com> * cp-tree.h (cp_expr): When constructing from an expr and a location, call protected_set_expr_location.
2020-03-23c++: Avoid a suspicious -Wnoexcept warning [PR93805]Patrick Palka3-2/+11
In this PR we're emitting -Wnoexcept warnings about potentially-throwing NSDMIs when computing the noexcept specification of a class's defaulted default constructor. Although these warnings are in some sense valid, this patch takes the route of suppressing them, because: 1. the warning message is confusing in its current form; 2. warning for 'struct C { B b = B(); };' but not for 'struct C { B b; };' is inconsistent; and 3. emitting a warning here arguably doesn't fall under the umbrella of -Wnoexcept, whose documentation says it warns only when a noexcept-expression evaluates to false, but there are no noexcept-expressions here. gcc/cp/ChangeLog: PR c++/93805 * except.c (maybe_noexcept_warning): Add TODO comment. * method.c (walk_field_subobs): Pass tf_none to expr_noexcept_p. gcc/testsuite/ChangeLog: PR c++/93805 * g++.dg/warn/Wnoexcept2.C: New test.
2020-03-23[PR94044] Fix ICE with sizeof<argumentpack>Nathan Sidwell2-1/+11
Thanks to Jim for figuring out how to reproduce the problem, I was able to apply pr94044-jig.diff to poorly hash the specialization table. (That places all the specializations of a particular template in the same bucket, forcing us to compare the arguments.) The testcase creates sizeof_exprs containing argument packs, and we can no longer use same_type_p on those. PR c++/94044 * tree.c (cp_tree_equal) [SIZEOF_EXPR]: Detect argument pack operand.
2020-03-21c++: Reject changing active member of union during initialization [PR94066]Patrick Palka2-9/+78
This patch adds a check to detect changing the active union member during initialization of another member of the union in cxx_eval_store_expression. It uses the CONSTRUCTOR_NO_CLEARING flag as a proxy for whether the non-empty CONSTRUCTOR of UNION_TYPE we're assigning to is in the process of being initialized. This patch additionally fixes an issue in reduced_constant_expression_p where we were returning false for an uninitialized union with no active member. This lets us correctly reject the uninitialized use in the testcase testconstexpr-union4.C that we weren't before. gcc/cp/ChangeLog: PR c++/94066 * constexpr.c (reduced_constant_expression_p) [CONSTRUCTOR]: Properly handle unions without an initializer. (cxx_eval_component_reference): Emit a different diagnostic when the constructor element corresponding to a union member is NULL. (cxx_eval_bare_aggregate): When constructing a union, always set the active union member before evaluating the initializer. Relax assertion that verifies the index of the constructor element we're initializing hasn't been changed. (cxx_eval_store_expression): Diagnose changing the active union member while the union is in the process of being initialized. After setting an active union member, clear CONSTRUCTOR_NO_CLEARING on the underlying CONSTRUCTOR. (cxx_eval_constant_expression) [PLACEHOLDER_EXPR]: Don't re-reduce a CONSTRUCTOR returned by lookup_placeholder. gcc/testsuite/ChangeLog: PR c++/94066 * g++.dg/cpp1y/constexpr-union2.C: New test. * g++.dg/cpp1y/constexpr-union3.C: New test. * g++.dg/cpp1y/constexpr-union4.C: New test. * g++.dg/cpp1y/constexpr-union5.C: New test. * g++.dg/cpp1y/pr94066.C: New test. * g++.dg/cpp1y/pr94066-2.C: New test. * g++.dg/cpp1y/pr94066-3.C: New test. * g++.dg/cpp2a/constexpr-union1.C: New test.
2020-03-20c++: Include the constraint parameter mapping in diagnostic constraint contextsPatrick Palka4-34/+30
When diagnosing a constraint error, we currently try to print the constraint inside a diagnostic constraint context with its template arguments substituted in. If substitution fails, then we instead just print the dependent form, as in the test case below: .../diagnostic6.C:14:15: error: static assertion failed 14 | static_assert(E<int>); // { dg-error "static assertion failed|not a class" } | ^~~~~~ .../diagnostic6.C:14:15: note: constraints not satisfied .../diagnostic6.C:4:11: required for the satisfaction of ‘C<T>’ .../diagnostic6.C:8:11: required for the satisfaction of ‘D<typename T::type>’ .../diagnostic6.C:14:15: error: ‘int’ is not a class, struct, or union type But printing just the dependent form sometimes makes it difficult to understand the underlying failure. In the above example, for instance, there's no indication of how the template argument 'int' relates to either of the 'T's. This patch improves the situation by changing these diagnostics to always print the dependent form of the constraint, and alongside it the (preferably substituted) constraint parameter mapping. So with the same test case below we now get: .../diagnostic6.C:14:15: error: static assertion failed 14 | static_assert(E<int>); // { dg-error "static assertion failed|not a class" } | ^~~~~~ .../diagnostic6.C:14:15: note: constraints not satisfied .../diagnostic6.C:4:11: required for the satisfaction of ‘C<T>’ [with T = typename T::type] .../diagnostic6.C:8:11: required for the satisfaction of ‘D<typename T::type>’ [with T = int] .../diagnostic6.C:14:15: error: ‘int’ is not a class, struct, or union type This change arguably makes it easier to figure out what's going on whenever a constraint fails due to substitution creating an invalid type rather than failing due to the constraint evaluating to false. gcc/cp/ChangeLog: * cxx-pretty-print.c (pp_cxx_parameter_mapping): Make extern. Move the "[with ]" bits to here from ... (pp_cxx_atomic_constraint): ... here. * cxx-pretty-print.h (pp_cxx_parameter_mapping): Declare. * error.c (rebuild_concept_check): Delete. (print_concept_check_info): Print the dependent form of the constraint and the preferably substituted parameter mapping alongside it. gcc/testsuite/ChangeLog: * g++.dg/concepts/diagnostic6.C: New test.
2020-03-19c++: Avoid unnecessary empty class copy [94175].Jason Merrill4-1/+28
A simple empty class copy is still simple when wrapped in a TARGET_EXPR, so we need to strip that as well. This change also exposed some unnecessary copies in return statements, which when returning by invisible reference led to <RETURN_EXPR <MEM_REF <RESULT_DECL>>>, which gimplify_return_expr didn't like. So we also need to strip the _REF when we eliminate the INIT_EXPR. gcc/cp/ChangeLog 2020-03-19 Jason Merrill <jason@redhat.com> PR c++/94175 * cp-gimplify.c (simple_empty_class_p): Look through SIMPLE_TARGET_EXPR_P. (cp_gimplify_expr) [MODIFY_EXPR]: Likewise. [RETURN_EXPR]: Avoid producing 'return *retval;'. * call.c (build_call_a): Strip TARGET_EXPR from empty class arg. * cp-tree.h (SIMPLE_TARGET_EXPR_P): Check that TARGET_EXPR_INITIAL is non-null.
2020-03-19c++: Fix up handling of captured vars in lambdas in OpenMP clauses [PR93931]Jakub Jelinek3-6/+21
Without the parser.c change we were ICEing on the testcase, because while the uses of the captured vars inside of the constructs were replaced with capture proxy decls, we didn't do that for decls in OpenMP clauses. With that fixed, we don't ICE anymore, but the testcase is miscompiled and FAILs at runtime. This is because the capture proxy decls have DECL_VALUE_EXPR and during gimplification we were gimplifying those to their DECL_VALUE_EXPRs. That is fine for shared vars, but for privatized ones we must not do that. So that is what the cp-gimplify.c changes do. Had to add a DECL_CONTEXT check before calling is_capture_proxy because some VAR_DECLs don't have DECL_CONTEXT set (yet) and is_capture_proxy relies on that being non-NULL always. 2020-03-19 Jakub Jelinek <jakub@redhat.com> PR c++/93931 * parser.c (cp_parser_omp_var_list_no_open): Call process_outer_var_ref on outer_automatic_var_p decls. * cp-gimplify.c (cxx_omp_disregard_value_expr): Return true also for capture proxy decls. * testsuite/libgomp.c++/pr93931.C: New test.
2020-03-18PR c++/94147 - mangling of lambdas assigned to globalsNathan Sidwell3-9/+39
This patch implements Jason's suggestion of pushing a lambda scope when parsing a global variable initializer. That bit worked fine, but happened to cause g++.dg/opt/dump1.C to not give any used-but-not-defined warnings. The reason was no_linkage_check, which considers any lambda that has an extra-scope to have linkage. Which is technically correct. Except that we think that all types that have linkage have external linkage. Our representation of linkage and visibility is somewhat inaccurate, particularly when it comes to types. We have TREE_PUBLIC, DECL_EXTERNAL, DECL_VISIBILITY, DECL_COMDAT, DECL_NOT_REALLY_EXTERN. It could really do with a through cleanup, but that won't be a simple task. The best I could come up with was seeing if the extra scope was a VAR_DECL, and if that was TREE_PUBLIC and the var was inline (its COMDATness is sadly not set at that point) or a template instantiation, then the lambda had linkage. Otherwise it's as-if it has no-linkage from the POV of compiler internals. This is an ABI change (so we should document it), but it's changing mangling from an unpredictable (in practice) counter, to something the ABI defines. So I'm not concerned about mangling-changed warnings, or preserving the broken mangling under some ABI selection flag. Code that did this worked by accident within a single TU. It'll continue to work by design there, and across TUs. * parser.c (cp_parser_init_declarator): Namespace-scope variables provide a lambda scope. * tree.c (no_linkage_check): Lambdas with a variable for extra scope have a linkage from the variable.
2020-03-18Fix up duplicated duplicated words in commentsJakub Jelinek5-10/+17
Another set of duplicated word fixes for things I've missed last time. These include e.g. *.cc files I forgot about, or duplicated words at the start or end of line. 2020-03-18 Jakub Jelinek <jakub@redhat.com> * asan.c (get_mem_refs_of_builtin_call): Fix up duplicated word issue in a comment. * config/arc/arc.c (frame_stack_add): Likewise. * gimple-loop-versioning.cc (loop_versioning::analyze_arbitrary_term): Likewise. * ipa-predicate.c (predicate::remap_after_inlining): Likewise. * tree-ssa-strlen.h (handle_printf_call): Likewise. * tree-ssa-strlen.c (is_strlen_related_p): Likewise. * optinfo-emit-json.cc (optrecord_json_writer::add_record): Likewise. analyzer/ * sm-malloc.cc (malloc_state_machine::on_stmt): Fix up duplicated word issue in a comment. * region-model.cc (region_model::make_region_for_unexpected_tree_code, region_model::delete_region_and_descendents): Likewise. * engine.cc (class exploded_cluster): Likewise. * diagnostic-manager.cc (class path_builder): Likewise. cp/ * constraint.cc (resolve_function_concept_check, subsumes_constraints, strictly_subsumes): Fix up duplicated word issue in a comment. * coroutines.cc (build_init_or_final_await, captures_temporary): Likewise. * logic.cc (dnf_size_r, cnf_size_r): Likewise. * pt.c (append_type_to_template_for_access_check): Likewise. d/ * expr.cc (ExprVisitor::visit (CatAssignExp *)): Fix up duplicated word issue in a comment. * d-target.cc (Target::FPTypeProperties<T>::max): Likewise. fortran/ * class.c (generate_finalization_wrapper): Fix up duplicated word issue in a comment. * trans-types.c (gfc_get_nodesc_array_type): Likewise.
2020-03-18c++: Diagnose a deduction guide in a wrong scope [PR91759]Jakub Jelinek2-0/+15
The following testcase is accepts-invalid since r7-6608-ga56c0ac08242269b. Before that change we had this "deduction guide %qD must be declared in the same scope as %qT" diagnostics for it, after the change it is expected to be diagnosed in set_decl_namespace at the not_found: label in there. On this testcase nothing is diagnosed though, because set_decl_namespace isn't called at all, as in_namespace is NULL. The following patch restores the old warning but does it only in case we don't call set_decl_namespace. 2020-03-18 Jakub Jelinek <jakub@redhat.com> PR c++/91759 * decl.c (grokfndecl): Restore old diagnostics about deduction guide declared in different scope if in_namespace is NULL_TREE. * g++.dg/cpp1z/class-deduction72.C: New test.
2020-03-17c++: Fix comment typo.Jason Merrill1-1/+1
2020-03-17c++: Fix parsing of invalid enum specifiers [PR90995]Jakub Jelinek2-31/+31
The testcase shows some accepts-invalid (the ones without alignas) and ice-on-invalid-code (the ones with alignas) cases. If the enum doesn't have an underlying type and is not a definition, the caller retries to parse it as elaborated type specifier. E.g. for enum struct S s it will then pedwarn that elaborated type specifier shouldn't have the struct/class keywords. The problem is if the enum specifier is not followed by { when it has underlying type. In that case we have already called cp_parser_parse_definitely to end the tentative parsing started at the beginning of cp_parser_enum_specifier. But the cp_parser_error (parser, "expected %<;%> or %<{%>"); doesn't emit any error because the whole function is called from yet another tentative parse and the caller starts parsing the elaborated type specifier where the cp_parser_enum_specifier stopped (i.e. after the underlying type token(s)). The ultimate caller than commits the tentative parsing (and even if it wouldn't, it wouldn't know what kind of error to report). I think after seeing enum {,struct,class} : type not being followed by { or ;, there is no reason not to report it right away, as it can't be valid C++, which is what the patch does. Not sure if we shouldn't also return error_mark_node instead of NULL_TREE, so that the caller doesn't try to parse it as elaborated type specifier (the patch doesn't do that right now). Furthermore, while reading the code, I've noticed that parser->colon_corrects_to_scope_p is saved and set to false at the start of the function, but not restored back in some cases. Don't have a testcase where this would be a problem, but it just seems wrong. Either we can in the two spots replace return NULL_TREE; with { type = NULL_TREE; goto out; } or we could perhaps abuse warning_sentinel or create a special class with dtor to clean the flag up. And lastly, I've fixed some formatting issues in the function while reading it. 2020-03-17 Jakub Jelinek <jakub@redhat.com> PR c++/90995 * parser.c (cp_parser_enum_specifier): Use temp_override for parser->colon_corrects_to_scope_p, replace goto out with return. If scoped enum or enum with underlying type is not followed by { or ;, call cp_parser_commit_to_tentative_parse before calling cp_parser_error and make sure to return error_mark_node instead of NULL_TREE. Formatting fixes. * g++.dg/cpp0x/enum40.C: New test.
2020-03-17Fix the ChangeLog after the __is_assignable/__is_constructible fixVille Voutilainen1-8/+1
2020-03-17c++: Fix access checks for __is_assignable and __is_constructibleVille Voutilainen2-2/+16
gcc/ PR c++/94197 * cp/method.c (assignable_expr): Use cp_unevaluated. (is_xible_helper): Push a non-deferred access check for the stub objects created by assignable_expr and constructible_expr. testsuite/ PR c++/94197 * g++.dg/ext/pr94197.C: New.
2020-03-17Fix up duplicated duplicated words mostly in commentsJakub Jelinek4-9/+19
In the r10-7197-gbae7b38cf8a21e068ad5c0bab089dedb78af3346 commit I've noticed duplicated word in a message, which lead me to grep for those and we have a tons of them. I've used grep -v 'long long\|optab optab\|template template\|double double' *.[chS] */*.[chS] *.def config/*/* 2>/dev/null | grep ' \([a-zA-Z]\+\) \1 ' Note, the command will not detect the doubled words at the start or end of line or when one of the words is at the end of line and the next one at the start of another one. Some of it is fairly obvious, e.g. all the "the the" cases which is something I've posted and committed patch for already e.g. in 2016, other cases are often valid, e.g. "that that" seems to look mostly ok to me. Some cases are quite hard to figure out, I've left out some of them from the patch (e.g. "and and" in some cases isn't talking about bitwise/logical and and so looks incorrect, but in other cases it is talking about those operations). In most cases the right solution seems to be to remove one of the duplicated words, but not always. I think most important are the ones with user visible messages (in the patch 3 of the first 4 hunks), the rest is just comments (and internal documentation; for that see the doc/tm.texi changes). 2020-03-17 Jakub Jelinek <jakub@redhat.com> * lra-spills.c (remove_pseudos): Fix up duplicated word issue in a dump message. * tree-sra.c (create_access_replacement): Fix up duplicated word issue in a comment. * read-rtl-function.c (find_param_by_name, function_reader::parse_enum_value, function_reader::get_insn_by_uid): Likewise. * spellcheck.c (get_edit_distance_cutoff): Likewise. * tree-data-ref.c (create_ifn_alias_checks): Likewise. * tree.def (SWITCH_EXPR): Likewise. * selftest.c (assert_str_contains): Likewise. * ipa-param-manipulation.h (class ipa_param_body_adjustments): Likewise. * tree-ssa-math-opts.c (convert_expand_mult_copysign): Likewise. * tree-ssa-loop-split.c (find_vdef_in_loop): Likewise. * langhooks.h (struct lang_hooks_for_decls): Likewise. * ipa-prop.h (struct ipa_param_descriptor): Likewise. * tree-ssa-strlen.c (handle_builtin_string_cmp, handle_store): Likewise. * tree-ssa-dom.c (simplify_stmt_for_jump_threading): Likewise. * tree-ssa-reassoc.c (reassociate_bb): Likewise. * tree.c (component_ref_size): Likewise. * hsa-common.c (hsa_init_compilation_unit_data): Likewise. * gimple-ssa-sprintf.c (get_string_length, format_string, format_directive): Likewise. * omp-grid.c (grid_process_kernel_body_copy): Likewise. * input.c (string_concat_db::get_string_concatenation, test_lexer_string_locations_ucn4): Likewise. * cfgexpand.c (pass_expand::execute): Likewise. * gimple-ssa-warn-restrict.c (builtin_memref::offset_out_of_bounds, maybe_diag_overlap): Likewise. * rtl.c (RTX_CODE_HWINT_P_1): Likewise. * shrink-wrap.c (spread_components): Likewise. * tree-ssa-dse.c (initialize_ao_ref_for_dse, valid_ao_ref_for_dse): Likewise. * tree-call-cdce.c (shrink_wrap_one_built_in_call_with_conds): Likewise. * dwarf2out.c (dwarf2out_early_finish): Likewise. * gimple-ssa-store-merging.c: Likewise. * ira-costs.c (record_operand_costs): Likewise. * tree-vect-loop.c (vectorizable_reduction): Likewise. * target.def (dispatch): Likewise. (validate_dims, gen_ccmp_first): Fix up duplicated word issue in documentation text. * doc/tm.texi: Regenerated. * config/i386/x86-tune.def (X86_TUNE_PARTIAL_FLAG_REG_STALL): Fix up duplicated word issue in a comment. * config/i386/i386.c (ix86_test_loading_unspec): Likewise. * config/i386/i386-features.c (remove_partial_avx_dependency): Likewise. * config/msp430/msp430.c (msp430_select_section): Likewise. * config/gcn/gcn-run.c (load_image): Likewise. * config/aarch64/aarch64-sve.md (sve_ld1r<mode>): Likewise. * config/aarch64/aarch64.c (aarch64_gen_adjusted_ldpstp): Likewise. * config/aarch64/falkor-tag-collision-avoidance.c (single_dest_per_chain): Likewise. * config/nvptx/nvptx.c (nvptx_record_fndecl): Likewise. * config/fr30/fr30.c (fr30_arg_partial_bytes): Likewise. * config/rs6000/rs6000-string.c (expand_cmp_vec_sequence): Likewise. * config/rs6000/rs6000-p8swap.c (replace_swapped_load_constant): Likewise. * config/rs6000/rs6000-c.c (rs6000_target_modify_macros): Likewise. * config/rs6000/rs6000.c (rs6000_option_override_internal): Likewise. * config/rs6000/rs6000-logue.c (rs6000_emit_probe_stack_range_stack_clash): Likewise. * config/nds32/nds32-md-auxiliary.c (nds32_split_ashiftdi3): Likewise. Fix various other issues in the comment. c-family/ * c-common.c (resolve_overloaded_builtin): Fix up duplicated word issue in a diagnostic message. cp/ * pt.c (tsubst): Fix up duplicated word issue in a diagnostic message. (lookup_template_class_1, tsubst_expr): Fix up duplicated word issue in a comment. * parser.c (cp_parser_statement, cp_parser_linkage_specification, cp_parser_placeholder_type_specifier, cp_parser_constraint_requires_parens): Likewise. * name-lookup.c (suggest_alternative_in_explicit_scope): Likewise. fortran/ * array.c (gfc_check_iter_variable): Fix up duplicated word issue in a comment. * arith.c (gfc_arith_concat): Likewise. * resolve.c (gfc_resolve_ref): Likewise. * frontend-passes.c (matmul_lhs_realloc): Likewise. * module.c (gfc_match_submodule, load_needed): Likewise. * trans-expr.c (gfc_init_se): Likewise.
2020-03-15coroutines: Fix indentation (NFC).Iain Sandoe2-4/+8
Whitespace-only change. gcc/cp/ChangeLog: 2020-03-15 Iain Sandoe <iain@sandoe.co.uk> * coroutines.cc (co_await_expander): Fix indentation.
2020-03-14c++: Fix ICE-after-error on partial spec [92068]Jason Merrill2-1/+14
Here the template arguments for the partial specialization are valid arguments for the template, but not for a partial specialization, because 'd' can never be deduced to anything other than an empty pack. gcc/cp/ChangeLog 2020-03-14 Jason Merrill <jason@redhat.com> PR c++/92068 * pt.c (process_partial_specialization): Error rather than crash on extra pack expansion.
2020-03-14c++: Find parameter pack in typedef in lambda [92909].Jason Merrill2-4/+18
find_parameter_packs_r doesn't look through typedefs, which is normally correct, but that means we need to handle their declarations specially. gcc/cp/ChangeLog 2020-03-14 Jason Merrill <jason@redhat.com> PR c++/92909 * pt.c (find_parameter_packs_r): [DECL_EXPR]: Walk DECL_ORIGINAL_TYPE of a typedef.
2020-03-14c++: Fix CTAD with multiple-arg ctor template [93248].Jason Merrill2-1/+10
When cp_unevaluated_operand is set, tsubst_decl thinks that if it sees a PARM_DECL that isn't already in local_specializations, we're in a decltype in a trailing return type or some such, and so we only want a substitution for a single PARM_DECL. In this case, we want the whole chain, so make sure cp_unevaluated_operand is cleared. gcc/cp/ChangeLog 2020-03-14 Jason Merrill <jason@redhat.com> PR c++/93248 * pt.c (build_deduction_guide): Clear cp_unevaluated_operand for substituting DECL_ARGUMENTS.
2020-03-14Fix doubled indefinite articles, mostly in comments.Jakub Jelinek3-2/+8
2020-03-14 Jakub Jelinek <jakub@redhat.com> * gimple-fold.c (gimple_fold_builtin_strncpy): Change "a an" to "an" in a comment. * hsa-common.h (is_a_helper): Likewise. * tree-ssa-strlen.c (maybe_diag_stxncpy_trunc): Likewise. * config/arc/arc.c (arc600_corereg_hazard): Likewise. * config/s390/s390.c (s390_indirect_branch_via_thunk): Likewise. * logic.cc (formula::formula): Change "a an" to "an" in a comment. * parser.c (cp_debug_parser): Change "a an" to "an" in a string literal.
2020-03-13c++: Redundant -Wdeprecated-declarations warning in build_over_call [PR67960]Patrick Palka2-0/+11
In build_over_call, we are emitting a redundant -Wdeprecated-declarations warning about the deprecated callee function, first from mark_used and again from build_addr_func <- decay_conversion <- cp_build_addr_expr <- mark_used. It seems this second deprecation warning coming from build_addr_func will always be redundant, so we can safely use a warning_sentinel to disable it before calling build_addr_func. (And any deprecation warning that could come from build_addr_func would be for FN, so we wouldn't be suppressing too much.) gcc/cp/ChangeLog: PR c++/67960 * call.c (build_over_call): Use a warning_sentinel to disable warn_deprecated_decl before calling build_addr_func. gcc/testsuite/ChangeLog: PR c++/67960 * g++.dg/diagnostic/pr67960.C: New test. * g++.dg/diagnostic/pr67960-2.C: New test.
2020-03-12c++: Tweak reshape_init_array_1 [PR94124]Jakub Jelinek2-5/+23
Isn't it wasteful to first copy perhaps a large constructor (recursively) and then truncate it to very few elts (zero in this case)? > We should certainly avoid copying if they're the same. The code above for > only copying the bits that aren't going to be thrown away seems pretty > straightforward, might as well use it even if the savings aren't likely to > be large. Calling vec_safe_truncate with the same number of elts the vector already has is a nop, so IMHO we just should make sure we only unshare if it changed. 2020-03-12 Jakub Jelinek <jakub@redhat.com> PR c++/94124 * decl.c (reshape_init_array_1): Don't unshare constructor if there aren't any trailing zero elts, otherwise only unshare the first nelts.
2020-03-11c++: Fix ICE with concepts and aliases [PR93907].Jason Merrill4-2/+13
The problem here was that we were checking satisfaction once with 'e', a typedef of 'void', and another time with 'void' directly, and treated them as different for hashing based on the assumption that canonicalize_type_argument would have already removed a typedef that wasn't a complex dependent alias. But that wasn't happening here, so let's add a call. gcc/cp/ChangeLog 2020-03-11 Jason Merrill <jason@redhat.com> PR c++/93907 * constraint.cc (tsubst_parameter_mapping): Canonicalize type argument.
2020-03-11c++: Fix wrong modifying const object error for COMPONENT_REF [PR94074]Marek Polacek2-1/+51
I got a report that building Chromium fails with the "modifying a const object" error. After some poking I realized it's a bug in GCC, not in their codebase. Much like with ARRAY_REFs, which can be const even though the array itself isn't, COMPONENT_REFs can be const although neither the object nor the field were declared const. So let's dial down the checking. Here the COMPONENT_REF was const because of the "const_cast<const U &>(m)" thing -- cxx_eval_component_reference then builds a COMPONENT_REF with TREE_TYPE (t). While looking into this I noticed that we don't detect modifying a const object in certain cases like in <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94074#c2>. That's because we never evaluate an X::X() CALL_EXPR -- there's none. Fixed as per Jason's suggestion by setting TREE_READONLY on a CONSTRUCTOR after initialization in cxx_eval_store_expression. 2020-03-11 Marek Polacek <polacek@redhat.com> Jason Merrill <jason@redhat.com> PR c++/94074 - wrong modifying const object error for COMPONENT_REF. * constexpr.c (cref_has_const_field): New function. (modifying_const_object_p): Consider a COMPONENT_REF const only if any of its fields are const. (cxx_eval_store_expression): Mark a CONSTRUCTOR of a const type as readonly after its initialization has been done. * g++.dg/cpp1y/constexpr-tracking-const17.C: New test. * g++.dg/cpp1y/constexpr-tracking-const18.C: New test. * g++.dg/cpp1y/constexpr-tracking-const19.C: New test. * g++.dg/cpp1y/constexpr-tracking-const20.C: New test. * g++.dg/cpp1y/constexpr-tracking-const21.C: New test. * g++.dg/cpp1y/constexpr-tracking-const22.C: New test.
2020-03-10c++: Fix wrong conversion error with non-viable overload [PR94124]Marek Polacek2-0/+13
This is a bad interaction between sharing a constructor for an array and stripping its trailing zero-initializers. Here we reuse a ctor and then strip its 0s. This breaks overload resolution in this test: D can be initialized from {} but not from {0}, so if we truncate the constructor not to include the zero, the F(D) overload becomes valid and then we get the ambiguous conversion error. PR c++/94124 - wrong conversion error with non-viable overload. * decl.c (reshape_init_array_1): Unshare a constructor if we stripped trailing zero-initializers. * g++.dg/cpp0x/initlist-overload1.C: New test.
2020-03-10c++: Fix deferred noexcept on constructor [PR93901].Jason Merrill2-7/+12
My change in r10-4394 to only update clones when we actually instantiate a deferred noexcept-spec broke this because deferred parsing updates the primary function but not the clones. For GCC 10, let's just revert it. gcc/cp/ChangeLog 2020-03-10 Jason Merrill <jason@redhat.com> PR c++/93901 * pt.c (maybe_instantiate_noexcept): Always update clones.
2020-03-10c++: Fix ICE with omitted template args [PR93956].Jason Merrill2-1/+6
reshape_init only wants to work on BRACE_ENCLOSED_INITIALIZER_P, i.e. raw initializer lists, and here was getting a CONSTRUCTOR that had already been processed for type A<int>. maybe_aggr_guide should also use that test. gcc/cp/ChangeLog 2020-03-10 Jason Merrill <jason@redhat.com> PR c++/93956 * pt.c (maybe_aggr_guide): Check BRACE_ENCLOSED_INITIALIZER_P.
2020-03-10c++: Partially revert patch for PR66139.Jason Merrill2-18/+11
The patch for 66139 exposed a long-standing bug with split_nonconstant_init (since 4.7, apparently): initializion of individual elements of an aggregate are not a full-expressions, but split_nonconstant_init was making full-expressions out of them. My fix for 66139 extended the use of split_nonconstant_init, and thus the bug, to aggregate initialization of temporaries within an expression, in which context (PR94041) the bug is more noticeable. PR93922 is a problem with my implementation strategy of splitting out at gimplification time, introducing function calls that weren't in the GENERIC. So I'm going to revert the patch now and try again for GCC 11. gcc/cp/ChangeLog 2020-03-10 Jason Merrill <jason@redhat.com> PR c++/93922 PR c++/94041 PR c++/52320 PR c++/66139 * cp-gimplify.c (cp_gimplify_init_expr): Partially revert patch for 66139: Don't split_nonconstant_init. Remove pre_p parameter.
2020-03-09c++: Fix convert_like in template [PR91465, PR93870, PR92031, PR94068]Marek Polacek6-30/+54
The point of this patch is to fix the recurring problem of trees generated by convert_like while processing a template that break when substituting. For instance, when convert_like creates a CALL_EXPR while in a template, substituting such a call breaks in finish_call_expr because we have two 'this' arguments. Another problem is that we can create &TARGET_EXPR<> and then fail when substituting because we're taking the address of an rvalue. I've analyzed some of the already fixed PRs and also some of the currently open ones: In c++/93870 we create EnumWrapper<E>::operator E(&operator~(E)). In c++/87145 we create S::operator int (&{N}). In c++/92031 we create &TARGET_EXPR <0>. The gist of the problem is when convert_like_real creates a call for a ck_user or wraps a TARGET_EXPR in & in a template. So in these cases use IMPLICIT_CONV_EXPR. In a template we shouldn't need to perform the actual conversion, we only need it's result type. perform_direct_initialization_if_possible and perform_implicit_conversion_flags can also create an IMPLICIT_CONV_EXPR. Given the change above, build_converted_constant_expr can return an IMPLICIT_CONV_EXPR so call fold_non_dependent_expr rather than maybe_constant_value to deal with that. To avoid the problem of instantiating something twice in a row I'm removing a call to instantiate_non_dependent_expr_sfinae in compute_array_index_type_loc. And the build_converted_constant_expr pattern can now be simplified. 2020-03-09 Marek Polacek <polacek@redhat.com> PR c++/92031 - bogus taking address of rvalue error. PR c++/91465 - ICE with template codes in check_narrowing. PR c++/93870 - wrong error when converting template non-type arg. PR c++/94068 - ICE with template codes in check_narrowing. * call.c (convert_like_real): Return IMPLICIT_CONV_EXPR in a template when not ck_identity and we're dealing with a class. (convert_like_real) <case ck_ref_bind>: Return IMPLICIT_CONV_EXPR in a template if we need a temporary. * decl.c (compute_array_index_type_loc): Remove instantiate_non_dependent_expr_sfinae call. Call fold_non_dependent_expr instead of maybe_constant_value. (build_explicit_specifier): Don't instantiate or create a sentinel before converting the expression. * except.c (build_noexcept_spec): Likewise. * pt.c (convert_nontype_argument): Don't build IMPLICIT_CONV_EXPR. Set IMPLICIT_CONV_EXPR_NONTYPE_ARG if that's what build_converted_constant_expr returned. * typeck2.c (check_narrowing): Call fold_non_dependent_expr instead of maybe_constant_value. * g++.dg/cpp0x/conv-tmpl2.C: New test. * g++.dg/cpp0x/conv-tmpl3.C: New test. * g++.dg/cpp0x/conv-tmpl4.C: New test. * g++.dg/cpp0x/conv-tmpl5.C: New test. * g++.dg/cpp0x/conv-tmpl6.C: New test. * g++.dg/cpp1z/conv-tmpl1.C: New test.
2020-03-09c++: Readd [LR]ROTATE_EXPR support to constexpr.c [PR94067]Jakub Jelinek2-0/+13
Since r10-6527-gaaa26bf496a646778ac861aed124d960b5bf549f fold_for_warn will perform maybe_constant_value even on some cp_fold produced trees and so can include rotate exprs which were removed last fall from constexpr.c 2020-03-09 Jakub Jelinek <jakub@redhat.com> PR c++/94067 Revert 2019-10-11 Paolo Carlini <paolo.carlini@oracle.com> * constexpr.c (cxx_eval_constant_expression): Do not handle RROTATE_EXPR and LROTATE_EXPR. * g++.dg/warn/Wconversion-pr94067.C: New test.
2020-03-09c++: Fix ABI issue with alignas on armv7hl [PR94050]Marek Polacek2-0/+10
The static_assert in the following test was failing on armv7hl because we were disregarding the alignas specifier on Cell. BaseShape's data takes up 20B on 32-bit architectures, but we failed to round up its TYPE_SIZE. This happens since the <https://gcc.gnu.org/ml/gcc-patches/2019-06/msg01189.html> patch: here, in layout_class_type for TenuredCell, we see that the size of TenuredCell and its CLASSTYPE_AS_BASE match, so we set CLASSTYPE_AS_BASE (t) = t; While TYPE_USER_ALIGN of TenuredCell was 0, because finalize_type_size called from finish_record_layout reset it, TYPE_USER_ALIGN of its CLASSTYPE_AS_BASE still remained 1. After we replace it, it's no longer 1. Then we perform layout_empty_base_or_field for TenuredCell and since TYPE_USER_ALIGN of its CLASSTYPE_AS_BASE is now 0, we don't do this adjustment: if (CLASSTYPE_USER_ALIGN (type)) { rli->record_align = MAX (rli->record_align, CLASSTYPE_ALIGN (type)); if (warn_packed) rli->unpacked_align = MAX (rli->unpacked_align, CLASSTYPE_ALIGN (type)); TYPE_USER_ALIGN (rli->t) = 1; } where rli->t is BaseShape. Then finalize_record_size won't use the correct rli->record_align and therefore /* Round the size up to be a multiple of the required alignment. */ TYPE_SIZE (rli->t) = round_up (unpadded_size, TYPE_ALIGN (rli->t)); after this we end up with the wrong size. Since the original fix was to avoid creating extra copies for LTO purposes, I think the following fix should be acceptable. PR c++/94050 - ABI issue with alignas on armv7hl. * class.c (layout_class_type): Don't replace a class's CLASSTYPE_AS_BASE if their TYPE_USER_ALIGN don't match. * g++.dg/abi/align3.C: New test.
2020-03-09Insert default return_void at the end of coroutine bodyBin Cheng2-31/+43
Exception in coroutine is not correctly handled because the default return_void call is now inserted before the finish suspend point, rather than at the end of the original coroutine body. This patch fixes the issue by expanding code as following: co_await promise.initial_suspend(); try { // The original coroutine body promise.return_void(); // The default return_void call. } catch (...) { promise.unhandled_exception(); } final_suspend: // ... gcc/cp/ * coroutines.cc (build_actor_fn): Factor out code inserting the default return_void call to... (morph_fn_to_coro): ...here, also hoist local var declarations. gcc/testsuite/ * g++.dg/coroutines/torture/co-ret-15-default-return_void.C: New.
2020-03-08c++: Fix missing SFINAE when binding a bit-field to a reference (PR 93729)Patrick Palka2-9/+16
We are unconditionally emitting an error here, without first checking complain. gcc/cp/ChangeLog: PR c++/93729 * call.c (convert_like_real): Check complain before emitting an error about binding a bit-field to a reference. gcc/testsuite/ChangeLog: PR c++/93729 * g++.dg/concepts/pr93729.C: New test.