[Bug c++/60742] New: ill-formed declarator (array) in selection statement not caught appropriately
filip.roseen at gmail dot com
gcc-bugzilla@gcc.gnu.org
Wed Apr 2 20:31:00 GMT 2014
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60742
Bug ID: 60742
Summary: ill-formed declarator (array) in selection statement
not caught appropriately
Product: gcc
Version: 4.9.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: filip.roseen at gmail dot com
Created attachment 32527
--> http://gcc.gnu.org/bugzilla/attachment.cgi?id=32527&action=edit
testcase.cpp
int main () {
if (int a[3] = {1,2,3}) {
(void)a;
}
}
-------------------------------------------------------------
[stmt.select]p2:
> The rules for conditions apply both to selction-statements and to
> the for and while statements (6.5) __The declarator shall not
> specify a function or an array.__ If the auto type-specifier appears
> in the decl-specifier-seq, the type of the identifier being
> declared is deduced from the initializer as described in 7.1.6.4.
-------------------------------------------------------------
H20:/tmp% g++ -std=c++11 -pedantic-errors testcase.cpp;
H20:/tmp% g++ -std=c++11 -pedantic-errors -Waddress testcase.cpp;
testcase.cpp: In function ‘int main()’:
testcase.cpp:2:25: warning: the address of ‘a’ will always evaluate as ‘true’
[-Waddress]
if (int a[3] = {1,2,3}) {
-------------------------------------------------------------
As seen above a diagnostic is only issued if we do `-Waddress` (or some warning
flag that includes the mentioned one).
The problem isn't actually with the address of `a` always evaluting to `true`,
the major problem is that this kind of code is ill-formed; gcc should therefore
reject it.
[ Note: `clang` and `icc` both handles this correctly (ie. rejects it) ]
More information about the Gcc-bugs
mailing list