Unfortunately, that is not something we could include into the C header, since 
it would break compilation. 

What about just casting the __u16 to an enum changelog_rec_flags as needed, and 
declaring the local variables as the enum instead of an int?  

Failing that, if you don't need the ChangeLog support, we could #ifdef out that 
section of the header when compiling with __cplusplus so that at least the rest 
of the header is usable.  

Cheers, Andreas

> On Mar 16, 2017, at 09:17, François Tessier <[email protected]> wrote:
> 
> Here is the workaround I found (based on static_cast<>()):
> 
> - make a local copy of lustre_user.h and lustreapi.h
> - apply the attached patch on lustre_user.h
> - add an include parameter in your CXXFLAGS pointing to these files
> - compile with CC
> 
> It's clearly not the best solution but it's a working temporary band-aid...
> 
> ++
> 
> François
> 
> 
>> On 03/16/2017 07:44 AM, François Tessier wrote:
>>> On 03/15/2017 05:50 PM, Dilger, Andreas wrote:
>>>> On Mar 15, 2017, at 15:22, François Tessier <[email protected]> wrote:
>>>> I get the same errors with g++ (v. 6.3). I can't find what kind of 
>>>> compiler flag I can use to be able to compile this. It clearly comes from 
>>>> how C++ deals with enum. The solutions I've found consist in 
>>>> "static_casting" the int values... Modifying my local version of 
>>>> lustre_user.h is probably not the best idea :-)
>>> Have you tried adding the standard wrappers at the start and end of the 
>>> lustre_user.h header:
>>> 
>>> #ifdef __cplusplus
>>> extern "C" {
>>> #endif
>>> :
>>> <rest of header>
>>> #ifdef __cplusplus
>>> }
>>> #endif
>>> 
>>> I thought we had added those long ago, but I don't see them in the header 
>>> today.  If that fixes your problem, please file an LU ticket at 
>>> https://jira.hpdd.intel.com/ (and ideally a patch at 
>>> https://review.whamcloud.com/ too) and we can get this added to the header.
>>> 
>>> In the meantime, you could also wrap your "#include <lustre/lustre_user.h>" 
>>> similarly.
>> It doesn't fix the problem. I tried a more recent version of g++ or
>> several compiler options to force the use of C++11 [1] but with no success.
>>> Cheers, Andreas
>> Cheers,
>> François
>> 
>> [1] http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2347.pdf
>>>>> On 03/15/2017 02:14 PM, Patrick Farrell wrote:
>>>>> It looks like your compiler is being fussier than the C compiler.
>>>>> 
>>>>> Specifically, the problem appears to be with the enum type.  The C 
>>>>> compiler is happy to let pass using a short (cr_flags) where an enum is 
>>>>> called for (argument to changelog_rec_offset).  In C, I think an enum is 
>>>>> an int (so passing in a short like this is always fine).  I guess in C++ 
>>>>> either enum is not an int, or it's just fussier.
>>>>> 
>>>>> There might be a compiler flag to make it not error on this?  I am not 
>>>>> familiar with icpc, so I can't help with specifics.
>>>>> 
>>>>> You might also try a different C++ compiler, to see if it has a different 
>>>>> attitude towards that error.
>>>>> 
>>>>> One further thought, though:
>>>>> This is a C header.  Presumably, it is not intended to be included 
>>>>> directly in a C++ project?
>>>>> 
>>>>> - Patrick
>>>>> From: lustre-discuss <[email protected]> on behalf 
>>>>> of François Tessier <[email protected]>
>>>>> Sent: Wednesday, March 15, 2017 2:00:31 PM
>>>>> To: [email protected]
>>>>> Subject: [lustre-discuss] Compile a C++ app. using the Lustre API
>>>>> 
>>>>> Hi All,
>>>>> 
>>>>> I'm working on a piece of code using the Lustre API. To do so, I include
>>>>> lustreapi.h. When I compile my code with a C compiler (icc), everything
>>>>> is fine. However, when I compile it with a C++ compiler (icpc), I get
>>>>> these errors:
>>>>> 
>>>>> ---------------------------------
>>>>> 
>>>>> In file included from /usr/include/lustre/lustreapi.h(47),
>>>>>                 from topo.c(5):
>>>>> /usr/include/lustre/lustre_user.h(914): error: argument of type 
>>>>> "__u16={unsigned short}" is incompatible with parameter of type 
>>>>> "changelog_rec_flags"
>>>>>         return changelog_rec_offset(rec->cr_flags);
>>>>>                                     ^
>>>>> 
>>>>> In file included from /usr/include/lustre/lustreapi.h(47),
>>>>>                 from topo.c(5):
>>>>> /usr/include/lustre/lustre_user.h(925): error: a value of type "int" 
>>>>> cannot be used to initialize an entity of type "changelog_rec_flags"
>>>>>         enum changelog_rec_flags crf = rec->cr_flags & CLF_VERSION;
>>>>>                                        ^
>>>>> 
>>>>> In file included from /usr/include/lustre/lustreapi.h(47),
>>>>>                 from topo.c(5):
>>>>> /usr/include/lustre/lustre_user.h(935): error: a value of type "int" 
>>>>> cannot be used to initialize an entity of type "changelog_rec_flags"
>>>>>         enum changelog_rec_flags crf = rec->cr_flags &
>>>>>                                        ^
>>>>> 
>>>>> In file included from /usr/include/lustre/lustreapi.h(47),
>>>>>                 from topo.c(5):
>>>>> /usr/include/lustre/lustre_user.h(945): error: argument of type "int" is 
>>>>> incompatible with parameter of type "changelog_rec_flags"
>>>>>         return (char *)rec + changelog_rec_offset(rec->cr_flags &
>>>>>                                                   ^
>>>>> 
>>>>> In file included from /usr/include/lustre/lustreapi.h(47),
>>>>>                 from topo.c(5):
>>>>> /usr/include/lustre/lustre_user.h(986): error: this operation on an 
>>>>> enumerated type requires an applicable user-defined operator function
>>>>>         crf_wanted &= CLF_SUPPORTED;
>>>>>                    ^
>>>>> 
>>>>> In file included from /usr/include/lustre/lustreapi.h(47),
>>>>>                 from topo.c(5):
>>>>> /usr/include/lustre/lustre_user.h(997): error: argument of type "int" is 
>>>>> incompatible with parameter of type "changelog_rec_flags"
>>>>>                   changelog_rec_offset(crf_wanted & ~CLF_JOBID);
>>>>>                                        ^
>>>>> 
>>>>> In file included from /usr/include/lustre/lustreapi.h(47),
>>>>>                 from topo.c(5):
>>>>> /usr/include/lustre/lustre_user.h(999): error: argument of type "int" is 
>>>>> incompatible with parameter of type "changelog_rec_flags"
>>>>>                   changelog_rec_offset(crf_wanted & ~(CLF_JOBID | 
>>>>> CLF_RENAME));
>>>>>                                        ^
>>>>> 
>>>>> Makefile:10: recipe for target 'topo' failed
>>>>> make: *** [topo] Error 2
>>>>> 
>>>>> ---------------------------------
>>>>> 
>>>>> It's probably more a compiler issue than a Lustre one but a solution
>>>>> could help other users or Lustre developers.
>>>>> 
>>>>> Any idea?
>>>>> 
>>>>> Thanks,
>>>>> 
>>>>> François
>>>>> 
>>>>> 
>>>>> -- 
>>>>> --
>>>>> François TESSIER, Ph.D.
>>>>> Postdoctoral Appointee
>>>>> Argonne National Laboratory
>>>>> LCF Division - Bldg 240, 4E 19
>>>>> Tel : +1 (630)-252-5068
>>>>> http://www.francoistessier.info
>>>>> 
>>>>> _______________________________________________
>>>>> lustre-discuss mailing list
>>>>> [email protected]
>>>>> http://lists.lustre.org/listinfo.cgi/lustre-discuss-lustre.org
>>>> _______________________________________________
>>>> lustre-discuss mailing list
>>>> [email protected]
>>>> http://lists.lustre.org/listinfo.cgi/lustre-discuss-lustre.org
>>> Cheers, Andreas
>>> --
>>> Andreas Dilger
>>> Lustre Principal Architect
>>> Intel Corporation
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>> _______________________________________________
>> lustre-discuss mailing list
>> [email protected]
>> http://lists.lustre.org/listinfo.cgi/lustre-discuss-lustre.org
> 
> <lustre_user_cxx.patch>
> _______________________________________________
> lustre-discuss mailing list
> [email protected]
> http://lists.lustre.org/listinfo.cgi/lustre-discuss-lustre.org
_______________________________________________
lustre-discuss mailing list
[email protected]
http://lists.lustre.org/listinfo.cgi/lustre-discuss-lustre.org

Reply via email to