[qfcc] Add failing test for super dealloc

While working on vkgen, I found a dealloc that wasn't calling [super
dealloc] but qfcc hadn't noticed it.
This commit is contained in:
Bill Currie 2023-02-26 15:48:04 +09:00
parent a907f78143
commit e07f25e10f
2 changed files with 55 additions and 0 deletions

View file

@ -81,6 +81,7 @@ test_build_errors=\
tools/qfcc/test/dealloc-warn.r \
tools/qfcc/test/dealloc-warn2.r \
tools/qfcc/test/dealloc-warn3.r \
tools/qfcc/test/dealloc-warn4.r \
tools/qfcc/test/double-demote-float.r \
tools/qfcc/test/double-demote-float-ainit.r \
tools/qfcc/test/double-demote-float-ginit.r \
@ -277,6 +278,9 @@ tools/qfcc/test/dealloc-warn2.run$(EXEEXT): tools/qfcc/test/dealloc-warn2.r $(qf
tools/qfcc/test/dealloc-warn3.run$(EXEEXT): tools/qfcc/test/dealloc-warn3.r $(qfcc_fail_run_deps)
@$(top_srcdir)/tools/qfcc/test/build-compile-fail-run $@ $(QFCC) $(QCFLAGS) $<
tools/qfcc/test/dealloc-warn4.run$(EXEEXT): tools/qfcc/test/dealloc-warn4.r $(qfcc_fail_run_deps)
@$(top_srcdir)/tools/qfcc/test/build-compile-fail-run $@ $(QFCC) $(QCFLAGS) $<
tools/qfcc/test/double-demote-int.run$(EXEEXT): tools/qfcc/test/double-demote-int.r $(qfcc_fail_run_deps)
@$(top_srcdir)/tools/qfcc/test/build-compile-fail-run $@ $(QFCC) $(QCFLAGS) $<

View file

@ -0,0 +1,51 @@
#pragma warn error
#pragma optimize on
void str_free(string str)
{
}
@interface Object
{
Class isa;
}
-(void)dealloc;
@end
@interface derived : Object
{
int free;
string foo;
id bar;
}
@end
@implementation Object
-(void) dealloc
{
// this is the root of the hierarchy, so no super to call, thus
// must not check for [super dealloc]
}
-(void) release
{
}
@end
@implementation derived
-(void) dealloc
{
// as this is a derived class, failure to call [super dealloc] will
// result in a memory leak (yes, there could be special allocators
// involved, in which case something will be needed to inform the
// compiler)
str_free (foo);
}
@end
void __obj_exec_class (struct obj_module *msg) = #0;
id obj_msgSend_super (Super *class, SEL op, ...) = #0;
int main ()
{
return 1; // test fails if compile succeeds (with -Werror)
}