
In an explicit build, the dependency scanner generates invocations with dependencies to module files to use during compilation. The pcm's passed in the invocations should match the ones that were imported by other modules that share the same dependencies. We have seen bugs caused from incorrect invocations that mismatch which module file to load. When this happens report it as a warning, to help with investigations, as that should never occur in a well behaved build scheduled from the dependency scanner. The warning flag is off by default.
65 lines
2.4 KiB
C
65 lines
2.4 KiB
C
/// This tests the expected error case when there is a mismatch between the pcm dependencies passed in
|
|
/// the command line with `fmodule-file` and whats encoded in the pcm.
|
|
|
|
/// The steps are:
|
|
/// 1. Build the module A with no dependencies. The first variant to build is A-1.pcm.
|
|
/// 2. Build the same module with files that resolve from different search paths.
|
|
/// This variant is named A-2.pcm.
|
|
/// 3. Build module B that depends on the earlier module A-1.pcm.
|
|
/// 4. Build client that directly depends on both modules (A & B),
|
|
/// but depends on a incompatible variant of A (A-2.pcm) for B to use.
|
|
|
|
// RUN: rm -rf %t
|
|
// RUN: split-file %s %t
|
|
|
|
// RUN: %clang_cc1 -emit-module -x c -fmodules -fno-implicit-modules -isysroot %t/Sysroot \
|
|
// RUN: -I%t/Sysroot/usr/include \
|
|
// RUN: -fmodule-name=A %t/Sysroot/usr/include/A/module.modulemap -o %t/A-1.pcm
|
|
|
|
// RUN: %clang_cc1 -emit-module -x c -fmodules -fno-implicit-modules -isysroot %t/Sysroot \
|
|
// RUN: -I%t/BuildDir \
|
|
// RUN: -fmodule-name=A %t/BuildDir/A/module.modulemap -o %t/A-2.pcm
|
|
|
|
// RUN: %clang_cc1 -emit-module -x c -fmodules -fno-implicit-modules -isysroot %t/Sysroot \
|
|
// RUN: -I%t/Sysroot/usr/include \
|
|
// RUN: -fmodule-map-file=%t/Sysroot/usr/include/A/module.modulemap \
|
|
// RUN: -fmodule-file=A=%t/A-1.pcm \
|
|
// RUN: -fmodule-name=B %t/Sysroot/usr/include/B/module.modulemap -o %t/B-1.pcm
|
|
|
|
// RUN: %clang_cc1 -x c -fmodules -fno-implicit-modules -isysroot %t/Sysroot \
|
|
// RUN: -I%t/BuildDir -I%t/Sysroot/usr/include \
|
|
// RUN: -fmodule-map-file=%t/BuildDir/A/module.modulemap \
|
|
// RUN: -fmodule-map-file=%t/Sysroot/usr/include/B/module.modulemap \
|
|
// RUN: -fmodule-file=A=%t/A-2.pcm -fmodule-file=B=%t/B-1.pcm \
|
|
// RUN: -Wmodule-file-mapping-mismatch -verify %s
|
|
|
|
|
|
#include <A/A.h>
|
|
#include <B/B.h> // expected-warning {{conflicts with imported file}} \
|
|
// expected-note {{imported by module 'B'}} \
|
|
// expected-error {{out of date and needs to be rebuilt}}
|
|
|
|
//--- Sysroot/usr/include/A/module.modulemap
|
|
module A [system] {
|
|
umbrella header "A.h"
|
|
}
|
|
//--- Sysroot/usr/include/A/A.h
|
|
typedef int A_t;
|
|
|
|
//--- Sysroot/usr/include/B/module.modulemap
|
|
module B [system] {
|
|
umbrella header "B.h"
|
|
}
|
|
|
|
//--- Sysroot/usr/include/B/B.h
|
|
#include <A/A.h>
|
|
typedef int B_t;
|
|
|
|
//--- BuildDir/A/module.modulemap
|
|
module A [system] {
|
|
umbrella header "A.h"
|
|
}
|
|
|
|
//--- BuildDir/A/A.h
|
|
typedef int A_t;
|