with a subset of the existing target CPU features or mismatched CPU names. While we can't check that the CPU name used to build the module will end up being able to codegen correctly for the translation unit, we actually check that the imported features are a subset of the existing features. While here, rewrite the code to use std::set_difference and have it diagnose all of the differences found. Test case added which walks the set relationships and ensures we diagnose all the right cases and accept the others. No functional change for implicit modules here, just better diagnostics. llvm-svn: 232248
67 lines
2.9 KiB
C++
67 lines
2.9 KiB
C++
// RUN: rm -rf %t
|
|
// RUN: cd %S
|
|
//
|
|
// RUN: %clang_cc1 -fmodules -x c++ -fmodules-cache-path=%t \
|
|
// RUN: -iquote Inputs/merge-target-features \
|
|
// RUN: -fno-implicit-modules -fno-modules-implicit-maps \
|
|
// RUN: -fmodule-map-file-home-is-cwd \
|
|
// RUN: -emit-module -fmodule-name=foo -o %t/foo.pcm \
|
|
// RUN: -triple i386-unknown-unknown \
|
|
// RUN: -target-cpu i386 -target-feature +sse2 \
|
|
// RUN: Inputs/merge-target-features/module.modulemap
|
|
//
|
|
// RUN: not %clang_cc1 -fmodules -x c++ -fmodules-cache-path=%t \
|
|
// RUN: -iquote Inputs/merge-target-features \
|
|
// RUN: -fno-implicit-modules -fno-modules-implicit-maps \
|
|
// RUN: -fmodule-map-file-home-is-cwd \
|
|
// RUN: -fmodule-map-file=Inputs/merge-target-features/module.modulemap \
|
|
// RUN: -fmodule-file=%t/foo.pcm \
|
|
// RUN: -triple i386-unknown-unknown \
|
|
// RUN: -target-cpu i386 \
|
|
// RUN: -fsyntax-only merge-target-features.cpp 2>&1 \
|
|
// RUN: | FileCheck --check-prefix=SUBSET %s
|
|
// SUBSET: AST file was compiled with the target feature'+sse2' but the current translation unit is not
|
|
//
|
|
// RUN: %clang_cc1 -fmodules -x c++ -fmodules-cache-path=%t \
|
|
// RUN: -iquote Inputs/merge-target-features \
|
|
// RUN: -fno-implicit-modules -fno-modules-implicit-maps \
|
|
// RUN: -fmodule-map-file-home-is-cwd \
|
|
// RUN: -fmodule-map-file=Inputs/merge-target-features/module.modulemap \
|
|
// RUN: -fmodule-file=%t/foo.pcm \
|
|
// RUN: -triple i386-unknown-unknown \
|
|
// RUN: -target-cpu i386 -target-feature +sse2 \
|
|
// RUN: -fsyntax-only merge-target-features.cpp 2>&1 \
|
|
// RUN: | FileCheck --allow-empty --check-prefix=SAME %s
|
|
// SAME-NOT: error:
|
|
//
|
|
// RUN: %clang_cc1 -fmodules -x c++ -fmodules-cache-path=%t \
|
|
// RUN: -iquote Inputs/merge-target-features \
|
|
// RUN: -fno-implicit-modules -fno-modules-implicit-maps \
|
|
// RUN: -fmodule-map-file-home-is-cwd \
|
|
// RUN: -fmodule-map-file=Inputs/merge-target-features/module.modulemap \
|
|
// RUN: -fmodule-file=%t/foo.pcm \
|
|
// RUN: -triple i386-unknown-unknown \
|
|
// RUN: -target-cpu i386 -target-feature +sse2 -target-feature +sse3 \
|
|
// RUN: -fsyntax-only merge-target-features.cpp 2>&1 \
|
|
// RUN: | FileCheck --allow-empty --check-prefix=SUPERSET %s
|
|
// SUPERSET-NOT: error:
|
|
//
|
|
// RUN: not %clang_cc1 -fmodules -x c++ -fmodules-cache-path=%t \
|
|
// RUN: -iquote Inputs/merge-target-features \
|
|
// RUN: -fno-implicit-modules -fno-modules-implicit-maps \
|
|
// RUN: -fmodule-map-file-home-is-cwd \
|
|
// RUN: -fmodule-map-file=Inputs/merge-target-features/module.modulemap \
|
|
// RUN: -fmodule-file=%t/foo.pcm \
|
|
// RUN: -triple i386-unknown-unknown \
|
|
// RUN: -target-cpu i386 -target-feature +cx16 \
|
|
// RUN: -fsyntax-only merge-target-features.cpp 2>&1 \
|
|
// RUN: | FileCheck --check-prefix=MISMATCH %s
|
|
// MISMATCH: AST file was compiled with the target feature'+sse2' but the current translation unit is not
|
|
// MISMATCH: current translation unit was compiled with the target feature'+cx16' but the AST file was not
|
|
|
|
#include "foo.h"
|
|
|
|
int test(int x) {
|
|
return foo(x);
|
|
}
|