diff options
author | Iain Sandoe <iain@sandoe.co.uk> | 2021-08-14 12:27:55 +0100 |
---|---|---|
committer | Iain Sandoe <iain@sandoe.co.uk> | 2021-08-18 19:41:43 +0100 |
commit | d2aa4e0b3b5053df8f5853d9ed29022ff0d3ecf6 (patch) | |
tree | af7be9b0ba6076f8d448735eb9eff65403a8cc33 /gcc/testsuite/objc.dg | |
parent | 220c410162ebece4fffa2912ed79e348d3731d77 (diff) | |
download | gcc-d2aa4e0b3b5053df8f5853d9ed29022ff0d3ecf6.zip gcc-d2aa4e0b3b5053df8f5853d9ed29022ff0d3ecf6.tar.gz gcc-d2aa4e0b3b5053df8f5853d9ed29022ff0d3ecf6.tar.bz2 |
Objective-C: fix crash with -fobjc-nilcheck
When -fobjc-nilcheck is enabled, messages that result in a struct type should
yield a zero-initialized struct when sent to nil. Currently, the frontend
crashes when it encounters this situation. This patch fixes the crash by
generating the tree for the `{}` initializer.
Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
Co-authored-by: Matt Jacobson <mhjacobson@me.com>
PR objc/101666
gcc/objc/ChangeLog:
* objc-act.c (objc_build_constructor): Handle empty constructor
lists.
* objc-next-runtime-abi-02.c (build_v2_objc_method_fixup_call):
Handle nil receivers.
(build_v2_build_objc_method_call): Likewise.
gcc/testsuite/ChangeLog:
* obj-c++.dg/pr101666-0.mm: New test.
* obj-c++.dg/pr101666-1.mm: New test.
* obj-c++.dg/pr101666.inc: New.
* objc.dg/pr101666-0.m: New test.
* objc.dg/pr101666-1.m: New test.
* objc.dg/pr101666.inc: New.
Diffstat (limited to 'gcc/testsuite/objc.dg')
-rw-r--r-- | gcc/testsuite/objc.dg/pr101666-0.m | 7 | ||||
-rw-r--r-- | gcc/testsuite/objc.dg/pr101666-1.m | 10 | ||||
-rw-r--r-- | gcc/testsuite/objc.dg/pr101666.inc | 29 |
3 files changed, 46 insertions, 0 deletions
diff --git a/gcc/testsuite/objc.dg/pr101666-0.m b/gcc/testsuite/objc.dg/pr101666-0.m new file mode 100644 index 0000000..5f87f60 --- /dev/null +++ b/gcc/testsuite/objc.dg/pr101666-0.m @@ -0,0 +1,7 @@ +/* { dg-do run } */ +/* { dg-skip-if "NeXT only" { *-*-* } { "-fgnu-runtime" } { "" } } */ +/* { dg-skip-if "ABI 2 only" { *-*-* && { ! objc2 } } { "*" } { "" } } */ +/* { dg-additional-options "-fobjc-nilcheck -Wno-objc-root-class" } */ + +#include "pr101666.inc" + diff --git a/gcc/testsuite/objc.dg/pr101666-1.m b/gcc/testsuite/objc.dg/pr101666-1.m new file mode 100644 index 0000000..41ef370 --- /dev/null +++ b/gcc/testsuite/objc.dg/pr101666-1.m @@ -0,0 +1,10 @@ +/* Later versions of Darwin can compile for 10.5, but cannot link it so we + can only run this test up to 10.13. */ +/* { dg-do compile { target *-*-darwin* } } */ +/* { dg-do run { target *-*-darwin[89]* *-*-darwin1[0-7]* } } */ +/* { dg-skip-if "NeXT only" { *-*-* } { "-fgnu-runtime" } { "" } } */ +/* { dg-skip-if "ABI 2 only" { *-*-* && { ! objc2 } } { "*" } { "" } } */ +/* { dg-additional-options "-fobjc-nilcheck -mmacosx-version-min=10.5 " } */ +/* { dg-additional-options "-Wno-objc-root-class" } */ + +#include "pr101666.inc" diff --git a/gcc/testsuite/objc.dg/pr101666.inc b/gcc/testsuite/objc.dg/pr101666.inc new file mode 100644 index 0000000..f1dddca --- /dev/null +++ b/gcc/testsuite/objc.dg/pr101666.inc @@ -0,0 +1,29 @@ +#include <stdlib.h> +struct point { double x, y, z; }; + +@interface Foo +- (struct point)bar; +- (struct point)baz; +@end + +@implementation Foo +- (struct point)bar { struct point q = { 1.0, 2.0, 3.0 }; return q; }; +- (struct point)baz { struct point q = { 4.0, 5.0, 6.0 }; return q; }; +@end + +/* Cases where a check for nil should be inserted by the compiler, when + -fobjc-nilcheck is in force. We should not attempt the calls, and the + result should be 0-filled. */ + +Foo *f; + +int main(void) { + struct point p = [f bar]; + if (p.x != 0.0 || p.y != 0.0 || p.z != 0.0) + abort (); + id nilobj = (id)0; + p = [nilobj baz]; + if (p.x != 0.0 || p.y != 0.0 || p.z != 0.0) + abort (); + return 0; +} |