[Bug c++/43453] Initialization of char array with string literal fails in mem-initializer
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43453 --- Comment #9 from Jason Merrill jason at gcc dot gnu.org --- Author: jason Date: Thu Jun 5 20:55:44 2014 New Revision: 211290 URL: http://gcc.gnu.org/viewcvs?rev=211290root=gccview=rev Log: PR c++/43453 * decl.c (check_initializer): Collapse a TREE_LIST here. * typeck2.c (store_init_value): Not here. Modified: trunk/gcc/cp/ChangeLog trunk/gcc/cp/decl.c trunk/gcc/cp/typeck2.c
[Bug c++/43453] Initialization of char array with string literal fails in mem-initializer
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43453 --- Comment #7 from paolo at gcc dot gnu.org paolo at gcc dot gnu.org --- Author: paolo Date: Wed Jun 4 22:30:39 2014 New Revision: 211248 URL: http://gcc.gnu.org/viewcvs?rev=211248root=gccview=rev Log: /cp 2014-06-04 Paolo Carlini paolo.carl...@oracle.com PR c++/43453 * typeck.c (cp_build_modify_expr): Handle array of characters initialized by a string literal. * decl.c (check_initializer): Handle parenthesized string literal as initializer. * typeck2.c (store_init_value): Remove redundant check. /testsuite 2014-06-04 Paolo Carlini paolo.carl...@oracle.com PR c++/43453 * g++.dg/init/pr43453.C: New. Added: trunk/gcc/testsuite/g++.dg/init/pr43453.C Modified: trunk/gcc/cp/ChangeLog trunk/gcc/cp/decl.c trunk/gcc/cp/typeck.c trunk/gcc/cp/typeck2.c trunk/gcc/testsuite/ChangeLog
[Bug c++/43453] Initialization of char array with string literal fails in mem-initializer
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43453 Paolo Carlini paolo.carlini at oracle dot com changed: What|Removed |Added Status|ASSIGNED|RESOLVED Resolution|--- |FIXED Assignee|paolo.carlini at oracle dot com|unassigned at gcc dot gnu.org --- Comment #8 from Paolo Carlini paolo.carlini at oracle dot com --- Fixed for 4.10.0.
[Bug c++/43453] Initialization of char array with string literal fails in mem-initializer
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43453 Paolo Carlini paolo.carlini at oracle dot com changed: What|Removed |Added Status|NEW |ASSIGNED CC|gcc-bugs at gcc dot gnu.org| Assignee|unassigned at gcc dot gnu.org |paolo.carlini at oracle dot com Target Milestone|--- |4.10.0 --- Comment #6 from Paolo Carlini paolo.carlini at oracle dot com --- Mine.
[Bug c++/43453] Initialization of char array with string literal fails in mem-initializer
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43453 Andrew Pinski pinskia at gcc dot gnu.org changed: What|Removed |Added Keywords||rejects-valid Target|i686-pc-linux-gnu | Status|UNCONFIRMED |NEW Last reconfirmed||2012-01-28 Host|i686-pc-linux-gnu | Ever Confirmed|0 |1 Known to fail||4.7.0 --- Comment #5 from Andrew Pinski pinskia at gcc dot gnu.org 2012-01-28 05:43:59 UTC --- Confirmed.
[Bug c++/43453] Initialization of char array with string literal fails in mem-initializer
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43453 --- Comment #4 from Johannes Schaub schaub.johannes at googlemail dot com 2011-05-14 16:18:58 UTC --- (In reply to comment #3) (In reply to comment #2) (In reply to comment #1) (In reply to comment #0) Fails to compile, but should work: struct A { char x[4]; A():x(bug) { } }; Error i get is: main.cpp:3: error: array used as initializer Why do you think it should work? For example, the following equivalent code is invalid as well: char x [4] (bug); This code is equivalent and is valid. At least, I don't see the Standard forbidding it. GCC is the only compiler I tested (comeau/edg, clang) that rejects it. I'm not actually sure anymore about the validity of this code. One can make a point about the initializer not being a mere string literal. At least the draft n3126 makes a difference of this, in that an initializer like ({a, b, c}) is not regarded as a braced-init-list, but rather as a parenthesized expression-list where the initializer list is handed as one argument. So I'm unsure whether an initializer like `(foo)` should be regarded as a string literal or not. I think I will send an issue report about this. Subsequent discussion with Jason showed that this is covered by 8.5p13: The form of initialization (using parentheses or =) is generally insignificant, but does matter when the initializer or the entity being initialized has a class type; As this is an array, the text in the Standard in general has to be interpreted that a = or a (..) initializer are equivalent, unless otherwise stated. So this is indeed a GCC bug (both that it rejects the member initialization and the parenthesized non-member initialization).
[Bug c++/43453] Initialization of char array with string literal fails in mem-initializer
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43453 --- Comment #3 from Johannes Schaub schaub-johannes at web dot de 2010-10-30 09:41:36 UTC --- (In reply to comment #2) (In reply to comment #1) (In reply to comment #0) Fails to compile, but should work: struct A { char x[4]; A():x(bug) { } }; Error i get is: main.cpp:3: error: array used as initializer Why do you think it should work? For example, the following equivalent code is invalid as well: char x [4] (bug); This code is equivalent and is valid. At least, I don't see the Standard forbidding it. GCC is the only compiler I tested (comeau/edg, clang) that rejects it. I'm not actually sure anymore about the validity of this code. One can make a point about the initializer not being a mere string literal. At least the draft n3126 makes a difference of this, in that an initializer like ({a, b, c}) is not regarded as a braced-init-list, but rather as a parenthesized expression-list where the initializer list is handed as one argument. So I'm unsure whether an initializer like `(foo)` should be regarded as a string literal or not. I think I will send an issue report about this.
[Bug c++/43453] Initialization of char array with string literal fails in mem-initializer
--- Comment #2 from schaub-johannes at web dot de 2010-08-28 14:39 --- (In reply to comment #1) (In reply to comment #0) Fails to compile, but should work: struct A { char x[4]; A():x(bug) { } }; Error i get is: main.cpp:3: error: array used as initializer Why do you think it should work? For example, the following equivalent code is invalid as well: char x [4] (bug); This code is equivalent and is valid. At least, I don't see the Standard forbidding it. GCC is the only compiler I tested (comeau/edg, clang) that rejects it. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43453
[Bug c++/43453] Initialization of char array with string literal fails in mem-initializer
--- Comment #1 from giecrilj at stegny dot 2a dot pl 2010-08-27 18:06 --- (In reply to comment #0) Fails to compile, but should work: struct A { char x[4]; A():x(bug) { } }; Error i get is: main.cpp:3: error: array used as initializer Why do you think it should work? For example, the following equivalent code is invalid as well: char x [4] (bug); -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43453