On Fri, Jun 3, 2016 at 8:23 AM, David P Grove <gro...@us.ibm.com> wrote: > Dmitri Gribenko <griboz...@gmail.com> wrote on 06/02/2016 06:19:33 PM: >> >> Could you check if there are multiple definitions of off_t or mode_t >> in different headers guarded by macros? Something like this, >> duplicated across several headers: >> >> #if !defined(_OFF_T_DEFINED) >> typedef __off_t off_t; >> #define _OFF_T_DEFINED >> #endif >> >> This is a frequent pattern used in C headers, but it is an antipattern >> for modules. With modules, all headers that are included into the >> module get #included into a single translation unit and compiled into >> a module, so only one of those typedefs will get activated (let's say >> in foo.h), and the other one will get hidden because it is seen second >> in the translation unit (let's say the one in bar.h gets hidden). If >> you then import just the submodule for bar.h, the off_t definition >> won't be visible, because it was #ifdef'ed out. >> >> There are fragile solutions to this (like including a header that >> happens to fix the build this time), but the only real fix is to make >> sure that there is only one place where a declaration can be located >> in a module, regardless of the set of headers. >> > > Thanks for the response Dmitri. Yes this is indeed the case. On my Ubuntu > 15.10 system there are conditional typedefs of this flavor in 5 > /usr/include/* header files for mode_t and in 6 header files for off_t. > > What do you recommend I should try to work around the messy state of the > system headers?
Try including sys/types.h before including any other header that can define these types. (For example, you can just include it at the top.) Another thing to try is to move sys/types.h to the very top in the modulemap, to make sure that it gets included first, and gets to "own" the definition. But the only real fix is to work with EGLIBC to make the headers module-friendly. You might want to ask on the cfe-dev, the Clang dev list, if there are other people interested in this. (I think Google might be, they are contributing heavily to the Clang modules implementation.) Dmitri -- main(i,j){for(i=2;;i++){for(j=2;j<i;j++){if(!(i%j)){j=0;break;}}if (j){printf("%d\n",i);}}} /*Dmitri Gribenko <griboz...@gmail.com>*/ _______________________________________________ swift-dev mailing list swift-dev@swift.org https://lists.swift.org/mailman/listinfo/swift-dev