https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119117
Bug ID: 119117
Summary: Implementation of "if declarations" makes instance
variables unknown under certain conditions
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: objc
Assignee: unassigned at gcc dot gnu.org
Reporter: yavor at gnu dot org
Target Milestone: ---
This was reported as https://bugs.debian.org/1096423 but I'm pretty sure it's a
GCC bug. There should be no scenario when an instance variable is "unknown" to
the compiler within a method implementation.
Here's a minimal reproducer that doesn't depend on gnustep-base:
$ cat > foo.m <<EOF
#import <objc/Object.h>
@interface Foo : Object
{
float angle;
}
- (float) angle;
@end
@implementation Foo
- (float) angle
{
int val = 30;
if (angle * val > 0.0)
return 90.0;
return 0.0;
}
@end
int
main (void)
{
return 0;
}
EOF
$ make foo LDLIBS=-lobjc
cc foo.m -lobjc -o foo
$ touch foo.m
$ make foo LDLIBS=-lobjc OBJC=gcc-15
gcc-15 foo.m -lobjc -o foo
foo.m: In function ‘-[Foo angle]’:
foo.m:16:7: error: unknown type name ‘angle’
16 | if (angle * val > 0.0)
| ^~~~~
foo.m:16:19: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘>’
token
16 | if (angle * val > 0.0)
| ^
foo.m:16:7: error: declaration in the controlling expression must have an
initializer
16 | if (angle * val > 0.0)
| ^~~~~
foo.m:17:17: error: expected ‘)’ before ‘return’
17 | return 90.0;
| ^
| )
18 |
19 | return 0.0;
| ~~~~~~
foo.m:16:6: note: to match this ‘(’
16 | if (angle * val > 0.0)
| ^
foo.m:20:1: error: expected expression before ‘}’ token
20 | }
| ^
$ cc --version
cc (Debian 14.2.0-17) 14.2.0
Copyright (C) 2024 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ gcc-15 --version
gcc-15 (Debian 15-20250220-1) 15.0.1 20250220 (experimental) [master
r15-7637-g94d01a88470]
Copyright (C) 2025 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
This got broken by the C2y if declarations implementation (PR c/117019, commit
440be01).