mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-02-16 17:01:53 +00:00
[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:
parent
a907f78143
commit
e07f25e10f
2 changed files with 55 additions and 0 deletions
|
@ -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) $<
|
||||
|
||||
|
|
51
tools/qfcc/test/dealloc-warn4.r
Normal file
51
tools/qfcc/test/dealloc-warn4.r
Normal 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)
|
||||
}
|
Loading…
Reference in a new issue