help with modules


Could someone help me understand what is wrong with the enclosed build module example? (It’s kind of in the form of a test, but ignore the comment for running the test, as it’s just a source file here.)

I’m trying to gear up to add a fixit message for undefined types which can be found in a module, but I can’t get this simple scenario to work. The idea is that if I later remove the #include, I’ll get an error on the undefined type, which nonetheless could be found in a module, allowing me to add a fixit.

In looking at other modules tests, it seems that if I put the file in a subdirectory and use a -I option, clang can find the module map there and load it, right?

In looking at this in a debugger, in the HandleIncludeDirective function, the lookupFile call at line 1452 loads the module map. But then at line 1655 a loadModule call loads the module map again, but fails.

To reproduce, just run the makefile, which produces: (1.12 KB)

It seems to work for me if I pass an absolute path to -I – does that help?

This is a known bug.

The problem is that when we go to build the module in “Inputs/UndefinedFixIt1”, we build some synthetic #includes for the contents of the module (relative to the current directory), then change into the “Inputs/UndefinedFixIt1” directory to perform the build of the module, where the includes we synthesized obviously don’t work. The workaround is to use absolute -I paths for any directory containing a module.

Patches to fix this would be welcome! =)

Thanks Nico and Richard. I’m working on fixing it.