298 lines · plain
1// This checks that clang-scan-deps properly outputs named module dependencies 2// when using the the scanning output format 'experimental-full'.3//4// See PR #72304.5// UNSUPPORTED: target={{.*}}-aix{{.*}}6//7// RUN: rm -fr %t8// RUN: mkdir -p %t9// RUN: split-file %s %t10//11// Check the separated dependency format.12// RUN: sed "s|DIR|%/t|g" %t/compile_commands.json.in > %t/compile_commands.json13// RUN: clang-scan-deps -format=experimental-full \14// RUN: -- %clang++ -std=c++20 -c -fprebuilt-module-path=%t %t/M.cppm -o %t/M.o \15// RUN: | sed 's:\\\\\?:/:g' \16// RUN: | FileCheck %t/M.cppm -DPREFIX=%/t17// RUN: clang-scan-deps -format=experimental-full \18// RUN: -- %clang++ -std=c++20 -c -fprebuilt-module-path=%t %t/Impl.cpp -o %t/Impl.o \19// RUN: | sed 's:\\\\\?:/:g' \20// RUN: | FileCheck %t/Impl.cpp -DPREFIX=%/t21// RUN: clang-scan-deps -format=experimental-full \22// RUN: -- %clang++ -std=c++20 -c -fprebuilt-module-path=%t %t/impl_part.cppm -o %t/impl_part.o \23// RUN: | sed 's:\\\\\?:/:g' \24// RUN: | FileCheck %t/impl_part.cppm -DPREFIX=%/t25// RUN: clang-scan-deps -format=experimental-full \26// RUN: -- %clang++ -std=c++20 -c -fprebuilt-module-path=%t %t/interface_part.cppm -o %t/interface_part.o \27// RUN: | sed 's:\\\\\?:/:g' \28// RUN: | FileCheck %t/interface_part.cppm -DPREFIX=%/t29// RUN: clang-scan-deps -format=experimental-full \30// RUN: -- %clang++ -std=c++20 -c -fprebuilt-module-path=%t %t/User.cpp -o %t/User.o \31// RUN: | sed 's:\\\\\?:/:g' \32// RUN: | FileCheck %t/User.cpp -DPREFIX=%/t33//34// Check the combined dependency format.35// RUN: clang-scan-deps -compilation-database %t/compile_commands.json -format=experimental-full \36// RUN: | sed 's:\\\\\?:/:g' \37// RUN: | FileCheck %t/Checks.cpp -DPREFIX=%/t38// RUN: clang-scan-deps --mode=preprocess-dependency-directives -compilation-database %t/compile_commands.json -format=experimental-full \39// RUN: | sed 's:\\\\\?:/:g' \40// RUN: | FileCheck %t/Checks.cpp -DPREFIX=%/t41 42//--- compile_commands.json.in43[44{45 "directory": "DIR",46 "command": "clang++ -std=c++20 DIR/M.cppm -c -o DIR/M.o -MT DIR/M.o.ddi -MD -MF DIR/P1689.dep",47 "file": "DIR/M.cppm",48 "output": "DIR/M.o"49},50{51 "directory": "DIR",52 "command": "clang++ -std=c++20 DIR/Impl.cpp -c -o DIR/Impl.o -MT DIR/Impl.o.ddi -MD -MF DIR/P1689.dep",53 "file": "DIR/Impl.cpp",54 "output": "DIR/Impl.o"55},56{57 "directory": "DIR",58 "command": "clang++ -std=c++20 DIR/impl_part.cppm -c -o DIR/impl_part.o -MT DIR/impl_part.o.ddi -MD -MF DIR/P1689.dep",59 "file": "DIR/impl_part.cppm",60 "output": "DIR/impl_part.o"61},62{63 "directory": "DIR",64 "command": "clang++ -std=c++20 DIR/interface_part.cppm -c -o DIR/interface_part.o -MT DIR/interface_part.o.ddi -MD -MF DIR/P1689.dep",65 "file": "DIR/interface_part.cppm",66 "output": "DIR/interface_part.o"67},68{69 "directory": "DIR",70 "command": "clang++ -std=c++20 DIR/User.cpp -c -o DIR/User.o -MT DIR/User.o.ddi -MD -MF DIR/P1689.dep",71 "file": "DIR/User.cpp",72 "output": "DIR/User.o"73}74]75 76//--- M.cppm77export module M;78export import :interface_part;79import :impl_part;80export void Hello();81 82// CHECK: {83// CHECK: "modules": []84// CHECK: "translation-units": [85// CHECK-NEXT: {86// CHECK: "commands": [87// CHECK-NEXT: {88// CHECK: "named-module": "M"89// CHECK-NEXT: "named-module-deps": [90// CHECK-NEXT: "M:interface_part",91// CHECK-NEXT: "M:impl_part"92// CHECK-NEXT: ]93// CHECK: "command-line": [94// CHECK: "-o",95// CHECK-NEXT: "{{.*}}/M.o"96// CHECK: ]97// CHECK: "input-file": "[[PREFIX]]/M.cppm"98// CHECK: }99// CHECK: ]100// CHECK: }101// CHECK: ]102// CHECK: }103 104//--- Impl.cpp105module;106#include "header.mock"107module M;108void Hello() {109 std::cout << "Hello ";110}111 112// CHECK: {113// CHECK: "modules": []114// CHECK: "translation-units": [115// CHECK-NEXT: {116// CHECK: "commands": [117// CHECK-NEXT: {118// CHECK-NOT: "named-module":119// CHECK: "named-module-deps": [120// CHECK-NEXT: "M"121// CHECK-NEXT: ]122// CHECK: "command-line": [123// CHECK: "-o",124// CHECK-NEXT: "[[PREFIX]]/Impl.o"125// CHECK: ]126// CHECK: "input-file": "[[PREFIX]]/Impl.cpp"127// CHECK: }128// CHECK: ]129// CHECK: }130// CHECK: ]131// CHECK: }132 133//--- impl_part.cppm134module;135#include "header.mock"136module M:impl_part;137import :interface_part;138 139std::string W = "World.";140void World() {141 std::cout << W << std::endl;142}143 144// CHECK: {145// CHECK: "modules": [],146// CHECK: "translation-units": [147// CHECK-NEXT: {148// CHECK: "commands": [149// CHECK-NEXT: {150// CHECK: "named-module": "M:impl_part"151// CHECK-NEXT: "named-module-deps": [152// CHECK-NEXT: "M:interface_part"153// CHECK-NEXT: ]154// CHECK: "command-line": [155// CHECK: "-o",156// CHECK-NEXT: "{{.*}}/impl_part.o",157// CHECK: ]158// CHECK: "input-file": "[[PREFIX]]/impl_part.cppm"159// CHECK: }160// CHECK: ]161// CHECK: }162// CHECK: ]163// CHECK: }164 165//--- interface_part.cppm166export module M:interface_part;167export void World();168 169// CHECK: {170// CHECK: "modules": []171// CHECK: "translation-units": [172// CHECK-NEXT: {173// CHECK: "commands": [174// CHECK-NEXT: {175// CHECK: "named-module": "M:interface_part"176// CHECK-NOT: "named-module-deps": []177// CHECK: "command-line": [178// CHECK: "-o",179// CHECK-NEXT: "{{.*}}/interface_part.o",180// CHECK: ]181// CHECK: "input-file": "[[PREFIX]]/interface_part.cppm"182// CHECK: }183// CHECK: ]184// CHECK: }185// CHECK: ]186// CHECK: }187 188//--- User.cpp189import M;190import third_party_module;191int main() {192 Hello();193 World();194 return 0;195}196 197// CHECK: {198// CHECK-NEXT: "modules": []199// CHECK-NEXT: "translation-units": [200// CHECK-NEXT: {201// CHECK-NEXT: "commands": [202// CHECK-NEXT: {203// CHECK-NOT: "named-module":204// CHECK: "named-module-deps": [205// CHECK-NEXT: "M"206// CHECK-NEXT: "third_party_module"207// CHECK-NEXT: ]208// CHECK: "command-line": [209// CHECK: "-o",210// CHECK-NEXT: "[[PREFIX]]/User.o",211// CHECK: ]212// CHECK: "input-file": "[[PREFIX]]/User.cpp213// CHECK: }214// CHECK: ]215// CHECK-NEXT: }216// CHECK-NEXT: ]217// CHECK: }218 219//--- header.mock220 221//--- Checks.cpp222// CHECK: {223// CHECK: "modules": []224// CHECK: "translation-units": [225// CHECK-NEXT: {226// CHECK: "commands": [227// CHECK-NEXT: {228// CHECK: "named-module": "M"229// CHECK-NEXT: "named-module-deps": [230// CHECK-NEXT: "M:interface_part",231// CHECK-NEXT: "M:impl_part"232// CHECK-NEXT: ]233// CHECK: "command-line": [234// CHECK: "-o",235// CHECK-NEXT: "{{.*}}/M.o"236// CHECK: ]237// CHECK: "input-file": "[[PREFIX]]/M.cppm"238// CHECK: },239// CHECK: {240// CHECK-NOT: "named-module":241// CHECK: "named-module-deps": [242// CHECK-NEXT: "M"243// CHECK-NEXT: ]244// CHECK: "command-line": [245// CHECK: "-o",246// CHECK-NEXT: "[[PREFIX]]/Impl.o"247// CHECK: ]248// CHECK: "input-file": "[[PREFIX]]/Impl.cpp"249// CHECK: }250// CHECK: ]251// CHECK-NEXT: },252// CHECK-NEXT: {253// CHECK: "commands": [254// CHECK-NEXT: {255// CHECK: "named-module": "M:impl_part"256// CHECK-NEXT: "named-module-deps": [257// CHECK-NEXT: "M:interface_part"258// CHECK-NEXT: ]259// CHECK: "command-line": [260// CHECK: "-o",261// CHECK-NEXT: "{{.*}}/impl_part.o",262// CHECK: ]263// CHECK: "input-file": "[[PREFIX]]/impl_part.cppm"264// CHECK: }265// CHECK: ]266// CHECK-NEXT: },267// CHECK-NEXT: {268// CHECK: "commands": [269// CHECK-NEXT: {270// CHECK: "named-module": "M:interface_part"271// CHECK-NOT: "named-module-deps": []272// CHECK: "command-line": [273// CHECK: "-o",274// CHECK-NEXT: "{{.*}}/interface_part.o",275// CHECK: ]276// CHECK: "input-file": "[[PREFIX]]/interface_part.cppm"277// CHECK: }278// CHECK: ]279// CHECK-NEXT: },280// CHECK-NEXT: {281// CHECK: "commands": [282// CHECK-NEXT: {283// CHECK-NOT: "named-module":284// CHECK: "named-module-deps": [285// CHECK-NEXT: "M"286// CHECK-NEXT: "third_party_module"287// CHECK-NEXT: ]288// CHECK: "command-line": [289// CHECK: "-o",290// CHECK-NEXT: "[[PREFIX]]/User.o",291// CHECK: ]292// CHECK: "input-file": "[[PREFIX]]/User.cpp293// CHECK: } 294// CHECK: ]295// CHECK: }296// CHECK: ]297// CHECK: }298