Modules: Suggestion on how to fix a regression caused by r259901

Manman via cfe-commits cfe-commits at lists.llvm.org
Wed Sep 7 12:40:03 PDT 2016


Hi Richard,

We noticed a regression for this simple testing case:
rm -rf tmp3
clang -cc1 -fimplicit-module-maps -x objective-c -fmodules -fmodules-cache-path=tmp3 -emit-obj standalone.c -I Inputs/
—>
standalone.c:4:6: error: variable has incomplete type 'void'
void foo __P(());
     ^
standalone.c:4:9: error: expected ';' after top level declarator
void foo __P(());
        ^
        ;
2 errors generated.
clang -cc1 -fimplicit-module-maps -x objective-c -fmodules -fmodules-cache-path=tmp3 -emit-obj standalone.c -I Inputs/
—> This runs fine.

cat standalone.c
#import "C.h"
#import "A.h"

void foo __P(());

cat Inputs/module.map 
module X {
  header "A.h"
  export *
}
// Y imports X, it also uses “__P” as a parameter name
module Y {
  header "B.h"
  export *
}
// Z imports X and Y
module Z {
  header "C.h”
}

cat Inputs/A.h 
#define __P(protos)     ()

cat Inputs/B.h
#import "A.h"
#import "B2.h”

cat Inputs/B2.h 
void test(int __P) {
}

cat Inputs/C.h 
#import "A.h"
#import “B.h”

r259901 causes the compiler to write out identifier “__P” without the macro information for module Y, which seems to be incorrect. Any suggestion on how to fix this?
Why the 2nd run works is related to global index. Global Index only considers interesting identifiers, so it skips module Y when calling ModuleManager::visit.

Cheers,
Manman



More information about the cfe-commits mailing list