Groups | Search | Server Info | Login | Register


Groups > gnu.gnustep.help > #13

Re: NSAssert and noescape?

From Fred Kiefer <fredkiefer@gmx.de>
Newsgroups gnu.gnustep.help
Subject Re: NSAssert and noescape?
Date 2018-02-05 22:23 +0100
Message-ID <mailman.8635.1517865834.27995.help-gnustep@gnu.org> (permalink)
References <A4E4EBE0-8308-492F-A46C-5EA8340343F1@bignerdranch.com>

Show all headers | View raw


Hi Aaron,

thank you for this bug report. I really would like to hear more from your porting experiance

> Am 05.02.2018 um 19:47 schrieb Aaron Hillegass <aaron@bignerdranch.com>:
> 
> Hi,
> 
> I’m porting the FMDB library to run on GNUstep on Linux:
> 	https://github.com/ccgus/fmdb
> 
> I’m getting errors with the vargs on NSAssert:
> FMDatabase.m:1495:36: error: too many arguments provided to function-like macro invocation
>             NSAssert(false, @"%@", [self lastErrorMessage]);

This first issue here is a bug in GNUstep base. It looks to me like it is easy to fix. But as I am no expert on the usage of variadic arguments in C macros, I would prefer for Richard to look into this.
The problem is that the solution will have to work with different compilers and should still work when no extra arguments are given.
The simplest and safest solutions I see is to rename the macro  _NSAssertArgs to NSAssert in NSException and remove the old definition (and similar for NSCAssert). That way we keep the same tested code.

Interestingly nobody ever noticed this issue before in the over 20 years of GNUstep.

> /usr/local/include/Foundation/NSException.h:475:9: note: macro 'NSAssert' defined here
> #define NSAssert(condition, desc)                      
> 
> I’m also getting some warnings on noescape:
> ./FMDatabasePool.h:199:36: warning: unknown attribute 'noescape' ignored [-Wunknown-attributes]
> - (void)inDatabase:(__attribute__((noescape)) void (^)(FMDatabase *db))block;

This is a clang issue. Your clang version seems to be too old to support this attribute.


> Trivia for other who will come after me: I had to install libbsd and libdispatch. As a dumb work-around, I also defined some empty macros:
> 
> #ifdef __linux__
>     #define SInt32 int32_t
>     #define NS_SWIFT_NAME(the_name)
>     #define __deprecated_msg(the_message)
> #endif
> 
> Here’s how I’m building it:
> clang -x objective-c -fconstant-string-class=NSConstantString -fPIC -fobjc-nonfragile-abi -fblocks  -I/usr/local/include/ -c FMDatabase.m -o FMDatabase.o


I would always suggest to write a GNUmakefile even when a project is very small. That way you don’t have to fiddle with the compiler parameters yourself.

Cheers
Fred

Back to gnu.gnustep.help | Previous | Next | Find similar


Thread

Re: NSAssert and noescape? Fred Kiefer <fredkiefer@gmx.de> - 2018-02-05 22:23 +0100

csiph-web