Re: [cfe-users] Porting preprocessor macros to be compatible with clang

2019-08-21 Thread Forumer 4umer via cfe-users
So a bit more explanation, the macros are used to generate data 
structure and methods and the following definition is used to declare a 
structure:


DEF_STRUCT(namedDate, namedDate, (std::string, name), (std::time_t, 
date))


On visual when I look at preprocessed file I get this (focus on line 
starting with struct namedDate) :


namespace LibTech
{
   namespace DataTypes
   {
  #line 1 "E:\\DEV\\FixMacroOnClang\\DeclareDatatypes.h"
  #line 17 "E:\\DEV\\FixMacroOnClang\\DeclareDatatypes.h"
  #line 12 "E:\\DEV\\FixMacroOnClang\\Protocol.h"
  #line 1 "E:\\DEV\\FixMacroOnClang\\DataTypesDef.h"

struct namedDate{ std::string name; std::time_t date; };

  #line 13 "E:\\DEV\\FixMacroOnClang\\Protocol.h"
  #line 1 "E:\\DEV\\FixMacroOnClang\\DeclareDatatypes.h"
  #line 1 "E:\\DEV\\FixMacroOnClang\\macro\\UndefDataTypesDef.h"
  #line 14 "E:\\DEV\\FixMacroOnClang\\DeclareDatatypes.h"
  #line 17 "E:\\DEV\\FixMacroOnClang\\DeclareDatatypes.h"
  #line 14 "E:\\DEV\\FixMacroOnClang\\Protocol.h"
   }

}

but when using clang I have this:

namespace LibTech
{
   namespace DataTypes
   {
  # 1 "E:\\DEV\\FixMacroOnClang/DeclareDatatypes.h" 1
  # 12 "E:\\DEV\\FixMacroOnClang/Protocol.h" 2
  # 1 "E:\\DEV\\FixMacroOnClang/DataTypesDef.h" 1

struct namedDate{ PP_GS 2 (TO_FIELD, (std::string, name), (std::time_t, 
date)) };


  # 13 "E:\\DEV\\FixMacroOnClang/Protocol.h" 2
  # 1 "E:\\DEV\\FixMacroOnClang/DeclareDatatypes.h" 1
  # 13 "E:\\DEV\\FixMacroOnClang/DeclareDatatypes.h"
  # 1 "E:\\DEV\\FixMacroOnClang/./macro/UndefDataTypesDef.h" 1
  # 14 "E:\\DEV\\FixMacroOnClang/DeclareDatatypes.h" 2
  # 14 "E:\\DEV\\FixMacroOnClang/Protocol.h" 2
 }
}

as you can see the macros used inside preprocessor.h doesn't work with 
clang I have macro PP_GS and TO_FIELD macros that are not expanded.


I cannot copy/paste all macro definitions because it won't be very easy 
to read but here is how it starts:


#ifndef DEF_ID_BEGIN

//...

#define TO_FIELD(type, name) type name;
#define DEF_STRUCT(type, dataTypeId, ...) struct type{ 
PP_FOREACH_GROUP(TO_FIELD,__VA_ARGS__) };


#else

#include "./macro/UndefDataTypesDef.h"
#undef TO_FIELD

#endif

and inside preprocessor.h

#define PP_PREFIX(Method) PP_##Method
#define PP_SUFFIX(N) N
#define PP_ENTRY(Method,N) PP_PREFIX(Method)PP_SUFFIX(N)
#define PP_CALL_PP_SN( Method, Func, N, ...) PP_ENTRY(Method,N) 
PP_FW(Func, __VA_ARGS__)


#define PP_FOREACH(Func, ...) PP_CALL_PP_SN( S, Func, PP_ARGCOUNT 
PP_FW(__VA_ARGS__), __VA_ARGS__ )
#define PP_FOREACH_GROUP(Func, ...) PP_CALL_PP_SN( GS, Func, PP_ARGCOUNT 
PP_FW(__VA_ARGS__), __VA_ARGS__ )



#define PP_RSEQ_N()\
63 ,62 ,61 ,60 ,\
59 ,58 ,57 ,56 ,55 ,54 ,53 ,52 ,51 ,50 ,\
49 ,48 ,47 ,46 ,45 ,44 ,43 ,42 ,41 ,40 ,\
39 ,38 ,37 ,36 ,35 ,34 ,33 ,32 ,31 ,30 ,\
29 ,28 ,27 ,26 ,25 ,24 ,23 ,22 ,21 ,20 ,\
19 ,18 ,17 ,16 ,15 ,14 ,13 ,12 ,11 ,10 ,\
9,8,7,6,5,4,3,2,1,0

#define PP_ARG_N( \
_1  ,_2  ,_3  ,_4  ,_5  ,_6  ,_7  ,_8  ,_9  ,_10 ,\
_11 ,_12 ,_13 ,_14 ,_15 ,_16 ,_17 ,_18 ,_19 ,_20 ,\
_21 ,_22 ,_23 ,_24 ,_25 ,_26 ,_27 ,_28 ,_29 ,_30 ,\
_31 ,_32 ,_33 ,_34 ,_35 ,_36 ,_37 ,_38 ,_39 ,_40 ,\
_41 ,_42 ,_43 ,_44 ,_45 ,_46 ,_47 ,_48 ,_49 ,_50 ,\
_51 ,_52 ,_53 ,_54 ,_55 ,_56 ,_57 ,_58 ,_59 ,_60 ,\
_61 ,_62 ,_63 ,  N , ...) N

#define PP_FW(...) (__VA_ARGS__)
#define PP_NARG_(...) PP_ARG_N PP_FW(__VA_ARGS__)
#define PP_ARGCOUNT(...) PP_NARG_(__VA_ARGS__,PP_RSEQ_N())

but have a look here to see all the macros: 
https://github.com/vrichomme/FixMacroOnClang/blob/master/preprocessor.h


Maybe one of the problem is with PP_FW(...) but not sure about that...

Thanks

___
cfe-users mailing list
cfe-users@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users


Re: [cfe-users] Porting preprocessor macros to be compatible with clang

2019-08-21 Thread Matthew Fernandez via cfe-users

> On Aug 21, 2019, at 05:36, Forumer 4umer via cfe-users 
>  wrote:
> 
> So a bit more explanation, the macros are used to generate data structure and 
> methods and the following definition is used to declare a structure:
> 
> DEF_STRUCT(namedDate, namedDate, (std::string, name), (std::time_t, date))
> 
> On visual when I look at preprocessed file I get this (focus on line starting 
> with struct namedDate) :
> 
> namespace LibTech
> {
>   namespace DataTypes
>   {
>  #line 1 "E:\\DEV\\FixMacroOnClang\\DeclareDatatypes.h"
>  #line 17 "E:\\DEV\\FixMacroOnClang\\DeclareDatatypes.h"
>  #line 12 "E:\\DEV\\FixMacroOnClang\\Protocol.h"
>  #line 1 "E:\\DEV\\FixMacroOnClang\\DataTypesDef.h"
> 
> struct namedDate{ std::string name; std::time_t date; };
> 
>  #line 13 "E:\\DEV\\FixMacroOnClang\\Protocol.h"
>  #line 1 "E:\\DEV\\FixMacroOnClang\\DeclareDatatypes.h"
> #line 1 "E:\\DEV\\FixMacroOnClang\\macro\\UndefDataTypesDef.h"
> #line 14 "E:\\DEV\\FixMacroOnClang\\DeclareDatatypes.h"
> #line 17 "E:\\DEV\\FixMacroOnClang\\DeclareDatatypes.h"
> #line 14 "E:\\DEV\\FixMacroOnClang\\Protocol.h"
>   }
> 
> }
> 
> but when using clang I have this:
> 
> namespace LibTech
> {
>   namespace DataTypes
>   {
>  # 1 "E:\\DEV\\FixMacroOnClang/DeclareDatatypes.h" 1
>  # 12 "E:\\DEV\\FixMacroOnClang/Protocol.h" 2
>  # 1 "E:\\DEV\\FixMacroOnClang/DataTypesDef.h" 1
> 
> struct namedDate{ PP_GS 2 (TO_FIELD, (std::string, name), (std::time_t, 
> date)) };
> 
>  # 13 "E:\\DEV\\FixMacroOnClang/Protocol.h" 2
>  # 1 "E:\\DEV\\FixMacroOnClang/DeclareDatatypes.h" 1
>  # 13 "E:\\DEV\\FixMacroOnClang/DeclareDatatypes.h"
>  # 1 "E:\\DEV\\FixMacroOnClang/./macro/UndefDataTypesDef.h" 1
>  # 14 "E:\\DEV\\FixMacroOnClang/DeclareDatatypes.h" 2
>  # 14 "E:\\DEV\\FixMacroOnClang/Protocol.h" 2
> }
> }
> 
> as you can see the macros used inside preprocessor.h doesn't work with clang 
> I have macro PP_GS and TO_FIELD macros that are not expanded.
> 
> I cannot copy/paste all macro definitions because it won't be very easy to 
> read but here is how it starts:
> 
> #ifndef DEF_ID_BEGIN
> 
> //...
> 
> #define TO_FIELD(type, name) type name;
> #define DEF_STRUCT(type, dataTypeId, ...) struct type{ 
> PP_FOREACH_GROUP(TO_FIELD,__VA_ARGS__) };
> 
> #else
> 
> #include "./macro/UndefDataTypesDef.h"
> #undef TO_FIELD
> 
> #endif
> 
> and inside preprocessor.h
> 
> #define PP_PREFIX(Method) PP_##Method
> #define PP_SUFFIX(N) N
> #define PP_ENTRY(Method,N) PP_PREFIX(Method)PP_SUFFIX(N)
> #define PP_CALL_PP_SN( Method, Func, N, ...) PP_ENTRY(Method,N) PP_FW(Func, 
> __VA_ARGS__)
> 
> #define PP_FOREACH(Func, ...) PP_CALL_PP_SN( S, Func, PP_ARGCOUNT 
> PP_FW(__VA_ARGS__), __VA_ARGS__ )
> #define PP_FOREACH_GROUP(Func, ...) PP_CALL_PP_SN( GS, Func, PP_ARGCOUNT 
> PP_FW(__VA_ARGS__), __VA_ARGS__ )
> 
> 
> #define PP_RSEQ_N()\
> 63 ,62 ,61 ,60 ,\
> 59 ,58 ,57 ,56 ,55 ,54 ,53 ,52 ,51 ,50 ,\
> 49 ,48 ,47 ,46 ,45 ,44 ,43 ,42 ,41 ,40 ,\
> 39 ,38 ,37 ,36 ,35 ,34 ,33 ,32 ,31 ,30 ,\
> 29 ,28 ,27 ,26 ,25 ,24 ,23 ,22 ,21 ,20 ,\
> 19 ,18 ,17 ,16 ,15 ,14 ,13 ,12 ,11 ,10 ,\
> 9,8,7,6,5,4,3,2,1,0
> 
> #define PP_ARG_N( \
> _1  ,_2  ,_3  ,_4  ,_5  ,_6  ,_7  ,_8  ,_9  ,_10 ,\
> _11 ,_12 ,_13 ,_14 ,_15 ,_16 ,_17 ,_18 ,_19 ,_20 ,\
> _21 ,_22 ,_23 ,_24 ,_25 ,_26 ,_27 ,_28 ,_29 ,_30 ,\
> _31 ,_32 ,_33 ,_34 ,_35 ,_36 ,_37 ,_38 ,_39 ,_40 ,\
> _41 ,_42 ,_43 ,_44 ,_45 ,_46 ,_47 ,_48 ,_49 ,_50 ,\
> _51 ,_52 ,_53 ,_54 ,_55 ,_56 ,_57 ,_58 ,_59 ,_60 ,\
> _61 ,_62 ,_63 ,  N , ...) N
> 
> #define PP_FW(...) (__VA_ARGS__)
> #define PP_NARG_(...) PP_ARG_N PP_FW(__VA_ARGS__)
> #define PP_ARGCOUNT(...) PP_NARG_(__VA_ARGS__,PP_RSEQ_N())
> 
> but have a look here to see all the macros: 
> https://github.com/vrichomme/FixMacroOnClang/blob/master/preprocessor.h
> 
> Maybe one of the problem is with PP_FW(...) but not sure about that…

It seems like there are two problems: (1) TO_FIELD comes out with a trailing 
comma and so does not get expanded and (2) PP_GS and 2 tokens are not joined 
which would also impeded further expansion. I would expect to see a further ## 
somewhere in your macros. It looks like you’re using [0] when maybe you want 
something more like [1]?

  [0]: https://groups.google.com/forum/#!topic/comp.std.c/d-6Mj5Lko_s 

  [1]: 
https://stackoverflow.com/questions/11761703/overloading-macro-on-number-of-arguments
 


___
cfe-users mailing list
cfe-users@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users