public inbox for gcc-bugs@sourceware.org help / color / mirror / Atom feed
* [Bug c++/61402] New: [C++1y] Init-capture with side effect not working for some types @ 2014-06-03 11:07 thibaut.lutz at googlemail dot com 2014-06-03 11:15 ` [Bug c++/61402] " thibaut.lutz at googlemail dot com ` (4 more replies) 0 siblings, 5 replies; 6+ messages in thread From: thibaut.lutz at googlemail dot com @ 2014-06-03 11:07 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61402 Bug ID: 61402 Summary: [C++1y] Init-capture with side effect not working for some types Product: gcc Version: 4.9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: thibaut.lutz at googlemail dot com Lambda functions with an init-capture for which the initializer has a side effect is not always taken into account. The example below defines a lambda with an init-capture, which increments a variable in the initalizer, and invoke the lambda immediately with the same variable as a parameter. The body of the lambda prints the value of the captured value and its parameters, which should be identical. Expected result: The captured value and the parameter should have the same value, since the instantiation of the lambda should be evaluated before its invocation. Actual results: for some types (at least bool and char), the increment inside the init-capture is partially evaluated: the captured value is correct but the side effect is gone. Other types are working as expected. Tested with: gcc 4.9.0 and 4.8.1 Code: --8<----8<----8<----8<----8<----8<-- #include <iostream> template<typename T> void foo(T t) { using namespace std; // print the original argument cout << endl << "par t = " << t << endl; { // lambda function declaration and invocation // capture argument by-copy after pre-increment [ i = ++t ] // take one parameter (T v) { // print captured value and argument cout << "cap i = ++t = " << i << endl << "arg v = " << v << endl; } // invocation with the new value of the argument (t); } } int main(){ foo(3.14f); // works OK foo(0); // works OK foo('a'); // fails! foo(false); // fails! } --8<----8<----8<----8<----8<----8<-- Program output: par t = 3.14 cap i = ++t = 4.14 arg v = 4.14 par t = 0 cap i = ++t = 1 arg v = 1 par t = a cap i = ++t = b arg v = a par t = 0 cap i = ++t = 1 arg v = 0 For the last two types (char and bool), we observe v == t instead of v == i. ^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug c++/61402] [C++1y] Init-capture with side effect not working for some types 2014-06-03 11:07 [Bug c++/61402] New: [C++1y] Init-capture with side effect not working for some types thibaut.lutz at googlemail dot com @ 2014-06-03 11:15 ` thibaut.lutz at googlemail dot com 2014-06-13 21:14 ` richard-gccbugzilla at metafoo dot co.uk ` (3 subsequent siblings) 4 siblings, 0 replies; 6+ messages in thread From: thibaut.lutz at googlemail dot com @ 2014-06-03 11:15 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61402 --- Comment #1 from Thibaut LUTZ <thibaut.lutz at googlemail dot com> --- I forgot to add that separating declaration and invocation seems to solve the problem: --8<----8<----8<----8<----8<----8<-- #include <iostream> template<typename T> void foo(T t) { using namespace std; cout << endl << "par t = " << t << endl; auto test = [ i = ++t ](T v) { cout << "cap i = ++t = " << i << endl << "arg v = " << v << endl; }; test(t); } int main(){ foo(3.14f); // works OK foo(0); // works OK foo('a'); // works OK foo(false); // works OK } --8<----8<----8<----8<----8<----8<-- ^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug c++/61402] [C++1y] Init-capture with side effect not working for some types 2014-06-03 11:07 [Bug c++/61402] New: [C++1y] Init-capture with side effect not working for some types thibaut.lutz at googlemail dot com 2014-06-03 11:15 ` [Bug c++/61402] " thibaut.lutz at googlemail dot com @ 2014-06-13 21:14 ` richard-gccbugzilla at metafoo dot co.uk 2014-11-25 9:37 ` [Bug c++/61402] [5 Regression][C++1y] " paolo.carlini at oracle dot com ` (2 subsequent siblings) 4 siblings, 0 replies; 6+ messages in thread From: richard-gccbugzilla at metafoo dot co.uk @ 2014-06-13 21:14 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61402 Richard Smith <richard-gccbugzilla at metafoo dot co.uk> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |richard-gccbugzilla@metafoo | |.co.uk --- Comment #2 from Richard Smith <richard-gccbugzilla at metafoo dot co.uk> --- Your testcase has undefined behavior: [ i = ++t ] /*...*/ (t); The increment and load of 't' are unsequenced. ^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug c++/61402] [5 Regression][C++1y] Init-capture with side effect not working for some types 2014-06-03 11:07 [Bug c++/61402] New: [C++1y] Init-capture with side effect not working for some types thibaut.lutz at googlemail dot com 2014-06-03 11:15 ` [Bug c++/61402] " thibaut.lutz at googlemail dot com 2014-06-13 21:14 ` richard-gccbugzilla at metafoo dot co.uk @ 2014-11-25 9:37 ` paolo.carlini at oracle dot com 2014-12-12 16:43 ` jason at gcc dot gnu.org 2014-12-18 17:47 ` [Bug c++/61402] -Wsequence-point doesn't notice unsequenced lambda init and function argument jason at gcc dot gnu.org 4 siblings, 0 replies; 6+ messages in thread From: paolo.carlini at oracle dot com @ 2014-11-25 9:37 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61402 Paolo Carlini <paolo.carlini at oracle dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2014-11-25 Summary|[C++1y] Init-capture with |[5 Regression][C++1y] |side effect not working for |Init-capture with side |some types |effect not working for some | |types Ever confirmed|0 |1 --- Comment #3 from Paolo Carlini <paolo.carlini at oracle dot com> --- Thanks. Mainline currently crashes on both testcases. And of course it would be nice to have a warning for this, like clang. ^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug c++/61402] [5 Regression][C++1y] Init-capture with side effect not working for some types 2014-06-03 11:07 [Bug c++/61402] New: [C++1y] Init-capture with side effect not working for some types thibaut.lutz at googlemail dot com ` (2 preceding siblings ...) 2014-11-25 9:37 ` [Bug c++/61402] [5 Regression][C++1y] " paolo.carlini at oracle dot com @ 2014-12-12 16:43 ` jason at gcc dot gnu.org 2014-12-18 17:47 ` [Bug c++/61402] -Wsequence-point doesn't notice unsequenced lambda init and function argument jason at gcc dot gnu.org 4 siblings, 0 replies; 6+ messages in thread From: jason at gcc dot gnu.org @ 2014-12-12 16:43 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61402 --- Comment #4 from Jason Merrill <jason at gcc dot gnu.org> --- Author: jason Date: Fri Dec 12 16:43:16 2014 New Revision: 218680 URL: https://gcc.gnu.org/viewcvs?rev=218680&root=gcc&view=rev Log: PR c++/61402 * lambda.c (add_capture): Don't pass a dependent type to variably_modified_type_p. Added: trunk/gcc/testsuite/g++.dg/cpp1y/lambda-init11.C Modified: trunk/gcc/cp/ChangeLog trunk/gcc/cp/lambda.c ^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug c++/61402] -Wsequence-point doesn't notice unsequenced lambda init and function argument 2014-06-03 11:07 [Bug c++/61402] New: [C++1y] Init-capture with side effect not working for some types thibaut.lutz at googlemail dot com ` (3 preceding siblings ...) 2014-12-12 16:43 ` jason at gcc dot gnu.org @ 2014-12-18 17:47 ` jason at gcc dot gnu.org 4 siblings, 0 replies; 6+ messages in thread From: jason at gcc dot gnu.org @ 2014-12-18 17:47 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61402 Jason Merrill <jason at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jason at gcc dot gnu.org Summary|[5 Regression][C++1y] |-Wsequence-point doesn't |Init-capture with side |notice unsequenced lambda |effect not working for some |init and function argument |types | --- Comment #5 from Jason Merrill <jason at gcc dot gnu.org> --- Updating summary. ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2014-12-18 17:47 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2014-06-03 11:07 [Bug c++/61402] New: [C++1y] Init-capture with side effect not working for some types thibaut.lutz at googlemail dot com 2014-06-03 11:15 ` [Bug c++/61402] " thibaut.lutz at googlemail dot com 2014-06-13 21:14 ` richard-gccbugzilla at metafoo dot co.uk 2014-11-25 9:37 ` [Bug c++/61402] [5 Regression][C++1y] " paolo.carlini at oracle dot com 2014-12-12 16:43 ` jason at gcc dot gnu.org 2014-12-18 17:47 ` [Bug c++/61402] -Wsequence-point doesn't notice unsequenced lambda init and function argument jason at gcc dot gnu.org
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).