Files
llvm-tms34010/clang/test/Driver/modules-driver-dep-graph-stdlib-modules.cpp
Naveen Seth Hanig a16511c2d9 [clang][modules-driver] Precompile std modules independently of -o and final phase (#199289)
With this, Standard library modules are always precompiled as the
primary output of their `-cc1` invocation, instead of being produced as
a byproduct of compiling the Standard library modules to object files.

This also keeps Standard library module precompilation independent of
the final phase specified on the command line, so importing them keep
working under `-fsyntax-only` (and other command-line options that
specify the final phase).

This also makes the Standard library module precompilation independent
of the `-o` flag, so that a command like `clang -std=c++23
-fmodules-driver main.cpp -o main` no longer redirects the Standard
library module outputs to 'main', breaking the compilation.
2026-05-28 14:19:44 +00:00

102 lines
3.9 KiB
C++

// This test checks the on-demand scanning of system inputs, in particular:
// 1. System inputs are scanned only when needed.
// 2. Imports between system modules are supported.
// RUN: split-file %s %t
// The standard library modules manifest (libc++.modules.json) is discovered
// relative to the installed C++ standard library runtime libraries
// We need to create them in order for Clang to find the manifest.
// RUN: rm -rf %t && split-file %s %t && cd %t
// RUN: mkdir -p %t/Inputs/usr/lib/x86_64-linux-gnu
// RUN: touch %t/Inputs/usr/lib/x86_64-linux-gnu/libc++.so
// RUN: touch %t/Inputs/usr/lib/x86_64-linux-gnu/libc++.a
// RUN: sed "s|DIR|%/t|g" %t/libc++.modules.json.in > \
// RUN: %t/Inputs/usr/lib/x86_64-linux-gnu/libc++.modules.json
// RUN: mkdir -p %t/Inputs/usr/lib/share/libc++/v1
// RUN: cat %t/std.cppm > %t/Inputs/usr/lib/share/libc++/v1/std.cppm
// RUN: cat %t/std.compat.cppm > %t/Inputs/usr/lib/share/libc++/v1/std.compat.cppm
// RUN: cat %t/core.cppm > %t/Inputs/usr/lib/share/core.cppm
// RUN: cat %t/unused.cppm > %t/Inputs/usr/lib/share/unused.cppm
// RUN: %clang -std=c++20 \
// RUN: -fmodules-driver -Rmodules-driver \
// RUN: -stdlib=libc++ \
// RUN: -resource-dir=%t/Inputs/usr/lib/x86_64-linux-gnu \
// RUN: --target=x86_64-linux-gnu \
// RUN: -fmodules-cache-path=%t/modules-cache \
// RUN: %t/main.cpp %t/foo.cpp \
// RUN: -### 2>&1 \
// RUN: | sed 's:\\\\\?:/:g' \
// RUN: | FileCheck %s -DPREFIX=%/t
// CHECK: digraph "Module Dependency Graph" {
//
// CHECK-DAG: "[[PREFIX]]/main.cpp-x86_64-unknown-linux-gnu" [fillcolor=3, label="{ Filename: [[PREFIX]]/main.cpp | Triple: x86_64-unknown-linux-gnu }"];
// CHECK-DAG: "[[PREFIX]]/foo.cpp-x86_64-unknown-linux-gnu" [fillcolor=3, label="{ Filename: [[PREFIX]]/foo.cpp | Triple: x86_64-unknown-linux-gnu }"];
// CHECK-DAG: "std-x86_64-unknown-linux-gnu" [fillcolor=2, label="{ Filename: {{.*}} | Module type: Named module | Module name: std | Triple: x86_64-unknown-linux-gnu }"];
// CHECK-DAG: "std.compat-x86_64-unknown-linux-gnu" [fillcolor=2, label="{ Filename: {{.*}} | Module type: Named module | Module name: std.compat | Triple: x86_64-unknown-linux-gnu }"];
// CHECK-DAG: "core-x86_64-unknown-linux-gnu" [fillcolor=2, label="{ Filename: {{.*}} | Module type: Named module | Module name: core | Triple: x86_64-unknown-linux-gnu }"];
//
// CHECK-DAG: "std-x86_64-unknown-linux-gnu" -> "[[PREFIX]]/main.cpp-x86_64-unknown-linux-gnu";
// CHECK-DAG: "std-x86_64-unknown-linux-gnu" -> "[[PREFIX]]/foo.cpp-x86_64-unknown-linux-gnu";
// CHECK-DAG: "std-x86_64-unknown-linux-gnu" -> "std.compat-x86_64-unknown-linux-gnu";
// CHECK-DAG: "std.compat-x86_64-unknown-linux-gnu" -> "[[PREFIX]]/main.cpp-x86_64-unknown-linux-gnu";
// CHECK-DAG: "core-x86_64-unknown-linux-gnu" -> "[[PREFIX]]/foo.cpp-x86_64-unknown-linux-gnu";
// CHECK: }
//--- main.cpp
import std;
import std.compat;
//--- foo.cpp
import std;
import core;
//--- std.cppm
export module std;
//--- std.compat.cppm
export module std.compat;
import std;
// The module 'core' is isn't really a system module in libc++ or libstdc++.
// This is only to test that any module marked with '"is-std-library": true' can
// be imported on demand.
//--- core.cppm
export module core;
//--- unused.cppm
export module unused;
//--- libc++.modules.json.in
{
"version": 1,
"revision": 1,
"modules": [
{
"logical-name": "std",
"source-path": "../share/libc++/v1/std.cppm",
"is-std-library": true
},
{
"logical-name": "std.compat",
"source-path": "../share/libc++/v1/std.compat.cppm",
"is-std-library": true
},
{
"logical-name": "core",
"source-path": "../share/core.cppm",
"is-std-library": true
},
{
"logical-name": "unused",
"source-path": "../share/unused.cppm",
"is-std-library": true
}
]
}