help-gnustep
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: NSAssert and noescape?


From: Fred Kiefer
Subject: Re: NSAssert and noescape?
Date: Mon, 5 Feb 2018 22:23:43 +0100

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


reply via email to

[Prev in Thread] Current Thread [Next in Thread]