brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.1 KiB · 99c2fab Raw
332 lines · plain
1// UNSUPPORTED: target={{.*}}-aix{{.*}}2//3// RUN: rm -fr %t4// RUN: mkdir -p %t5// RUN: split-file %s %t6//7// RUN: sed "s|DIR|%/t|g" %t/P1689.json.in > %t/P1689.json8// RUN: clang-scan-deps -compilation-database %t/P1689.json -format=p1689 | FileCheck %t/Checks.cpp -DPREFIX=%/t9// RUN: clang-scan-deps --mode=preprocess-dependency-directives -compilation-database %t/P1689.json -format=p1689 \10// RUN:   | sed 's:\\\\\?:/:g' \11// RUN:   | FileCheck %t/Checks.cpp -DPREFIX=%/t12//13// Check the separated dependency format. This is required by CMake for the case14// that we have non-exist files in a fresh build and potentially out-of-date after that.15// So the build system need to wrtie a compilation database just for scanning purposes,16// which is not so good. So here is the per file mode for P1689.17// RUN: clang-scan-deps -format=p1689 \18// RUN:   -- %clang++ -std=c++20 -c -fprebuilt-module-path=%t %t/M.cppm -o %t/M.o \19// RUN:   | sed 's:\\\\\?:/:g' \20// RUN:   | FileCheck %t/M.cppm -DPREFIX=%/t21// RUN: clang-scan-deps -format=p1689 \22// RUN:   -- %clang++ -std=c++20 -c -fprebuilt-module-path=%t %t/Impl.cpp -o %t/Impl.o \23// RUN:   | sed 's:\\\\\?:/:g' \24// RUN:   | FileCheck %t/Impl.cpp -DPREFIX=%/t25// RUN: clang-scan-deps -format=p1689 \26// RUN:   -- %clang++ -std=c++20 -c -fprebuilt-module-path=%t %t/impl_part.cppm -o %t/impl_part.o \27// RUN:   | sed 's:\\\\\?:/:g' \28// RUN:   | FileCheck %t/impl_part.cppm -DPREFIX=%/t29// RUN: clang-scan-deps -format=p1689 \30// RUN:   -- %clang++ -std=c++20 -c -fprebuilt-module-path=%t %t/interface_part.cppm -o %t/interface_part.o \31// RUN:   | sed 's:\\\\\?:/:g' \32// RUN:   | FileCheck %t/interface_part.cppm -DPREFIX=%/t33// RUN: clang-scan-deps -format=p1689 \34// RUN:   -- %clang++ -std=c++20 -c -fprebuilt-module-path=%t %t/User.cpp -o %t/User.o \35// RUN:   | sed 's:\\\\\?:/:g' \36// RUN:   | FileCheck %t/User.cpp -DPREFIX=%/t37//38// Check we can generate the make-style dependencies as expected.39// RUN: clang-scan-deps -format=p1689 \40// RUN:   -- %clang++ -std=c++20 -c -fprebuilt-module-path=%t %t/impl_part.cppm -o %t/impl_part.o \41// RUN:      -MT %t/impl_part.o.ddi -MD -MF %t/impl_part.dep42// RUN: cat %t/impl_part.dep \43// RUN:   | sed 's:\\\\\?:/:g' \44// RUN:   | FileCheck %t/impl_part.cppm -DPREFIX=%/t --check-prefix=CHECK-MAKE45//46// Check that we can generate multiple make-style dependency information with compilation database.47// RUN: cat %t/P1689.dep | FileCheck %t/Checks.cpp -DPREFIX=%/t --check-prefix=CHECK-MAKE48//49// Check that we can mix the use of -format=p1689 and -fmodules.50// RUN: clang-scan-deps -format=p1689 \51// RUN:   -- %clang++ -std=c++20 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/cache -c %t/impl_part.cppm -o %t/impl_part.o \52// RUN:   | sed 's:\\\\\?:/:g' \53// RUN:   | FileCheck %t/impl_part.cppm -DPREFIX=%/t54//55// Check the path in the make style dependencies are generated in relative path form56// RUN: cd %t57// RUN: clang-scan-deps -format=p1689 \58// RUN:   -- %clang++ -std=c++20 -c -fprebuilt-module-path=%t impl_part.cppm -o impl_part.o \59// RUN:      -MT impl_part.o.ddi -MD -MF impl_part.dep60// RUN: cat impl_part.dep \61// RUN:   | sed 's:\\\\\?:/:g' \62// RUN:   | FileCheck impl_part.cppm -DPREFIX=%/t --check-prefix=CHECK-MAKE-RELATIVE63 64 65//--- P1689.json.in66[67{68  "directory": "DIR",69  "command": "clang++ -std=c++20 DIR/M.cppm -c -o DIR/M.o -MT DIR/M.o.ddi -MD -MF DIR/P1689.dep",70  "file": "DIR/M.cppm",71  "output": "DIR/M.o"72},73{74  "directory": "DIR",75  "command": "clang++ -std=c++20 DIR/Impl.cpp -c -o DIR/Impl.o -MT DIR/Impl.o.ddi -MD -MF DIR/P1689.dep",76  "file": "DIR/Impl.cpp",77  "output": "DIR/Impl.o"78},79{80  "directory": "DIR",81  "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",82  "file": "DIR/impl_part.cppm",83  "output": "DIR/impl_part.o"84},85{86  "directory": "DIR",87  "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",88  "file": "DIR/interface_part.cppm",89  "output": "DIR/interface_part.o"90},91{92  "directory": "DIR",93  "command": "clang++ -std=c++20 DIR/User.cpp -c -o DIR/User.o -MT DIR/User.o.ddi -MD -MF DIR/P1689.dep",94  "file": "DIR/User.cpp",95  "output": "DIR/User.o"96}97]98 99//--- M.cppm100export module M;101export import :interface_part;102import :impl_part;103export void Hello();104 105// CHECK: {106// CHECK-NEXT:   "revision": 0,107// CHECK-NEXT:   "rules": [108// CHECK-NEXT:     {109// CHECK-NEXT:       "primary-output": "[[PREFIX]]/M.o",110// CHECK-NEXT:       "provides": [111// CHECK-NEXT:         {112// CHECK-NEXT:           "is-interface": true,113// CHECK-NEXT:           "logical-name": "M",114// CHECK-NEXT:           "source-path": "[[PREFIX]]/M.cppm"115// CHECK-NEXT:         }116// CHECK-NEXT:       ],117// CHECK-NEXT:       "requires": [118// CHECK-NEXT:         {119// CHECK-NEXT:           "logical-name": "M:interface_part"120// CHECK-NEXT:         },121// CHECK-NEXT:         {122// CHECK-NEXT:           "logical-name": "M:impl_part"123// CHECK-NEXT:         }124// CHECK-NEXT:       ]125// CHECK-NEXT:     }126// CHECK-NEXT:   ],127// CHECK-NEXT:   "version": 1128// CHECK-NEXT: }129 130//--- Impl.cpp131module;132#include "header.mock"133module M;134void Hello() {135    std::cout << "Hello ";136}137 138// CHECK: {139// CHECK-NEXT:   "revision": 0,140// CHECK-NEXT:   "rules": [141// CHECK-NEXT:     {142// CHECK-NEXT:       "primary-output": "[[PREFIX]]/Impl.o",143// CHECK-NEXT:       "requires": [144// CHECK-NEXT:         {145// CHECK-NEXT:           "logical-name": "M"146// CHECK-NEXT:         }147// CHECK-NEXT:       ]148// CHECK-NEXT:     }149// CHECK-NEXT:   ],150// CHECK-NEXT:   "version": 1151// CHECK-NEXT: }152 153//--- impl_part.cppm154module;155#include "header.mock"156module M:impl_part;157import :interface_part;158 159std::string W = "World.";160void World() {161    std::cout << W << std::endl;162}163 164// CHECK: {165// CHECK-NEXT:   "revision": 0,166// CHECK-NEXT:   "rules": [167// CHECK-NEXT:     {168// CHECK-NEXT:       "primary-output": "[[PREFIX]]/impl_part.o",169// CHECK-NEXT:       "provides": [170// CHECK-NEXT:         {171// CHECK-NEXT:           "is-interface": false,172// CHECK-NEXT:           "logical-name": "M:impl_part",173// CHECK-NEXT:           "source-path": "[[PREFIX]]/impl_part.cppm"174// CHECK-NEXT:         }175// CHECK-NEXT:       ],176// CHECK-NEXT:       "requires": [177// CHECK-NEXT:         {178// CHECK-NEXT:           "logical-name": "M:interface_part"179// CHECK-NEXT:         }180// CHECK-NEXT:       ]181// CHECK-NEXT:     }182// CHECK-NEXT:   ],183// CHECK-NEXT:   "version": 1184// CHECK-NEXT: }185 186// CHECK-MAKE: [[PREFIX]]/impl_part.o.ddi:187// CHECK-MAKE:   [[PREFIX]]/impl_part.cppm188// CHECK-MAKE:   [[PREFIX]]/header.mock189 190// CHECK-MAKE-RELATIVE: impl_part.o.ddi: impl_part.cppm header.mock191 192//--- interface_part.cppm193export module M:interface_part;194export void World();195 196// CHECK: {197// CHECK-NEXT:   "revision": 0,198// CHECK-NEXT:   "rules": [199// CHECK-NEXT:     {200// CHECK-NEXT:       "primary-output": "[[PREFIX]]/interface_part.o",201// CHECK-NEXT:       "provides": [202// CHECK-NEXT:         {203// CHECK-NEXT:           "is-interface": true,204// CHECK-NEXT:           "logical-name": "M:interface_part",205// CHECK-NEXT:           "source-path": "[[PREFIX]]/interface_part.cppm"206// CHECK-NEXT:         }207// CHECK-NEXT:       ]208// CHECK-NEXT:     }209// CHECK-NEXT:   ],210// CHECK-NEXT:   "version": 1211// CHECK-NEXT: }212 213//--- User.cpp214import M;215import third_party_module;216int main() {217    Hello();218    World();219    return 0;220}221 222// CHECK: {223// CHECK-NEXT:   "revision": 0,224// CHECK-NEXT:   "rules": [225// CHECK-NEXT:     {226// CHECK-NEXT:       "primary-output": "[[PREFIX]]/User.o",227// CHECK-NEXT:       "requires": [228// CHECK-NEXT:         {229// CHECK-NEXT:           "logical-name": "M"230// CHECK-NEXT:         },231// CHECK-NEXT:         {232// CHECK-NEXT:           "logical-name": "third_party_module"233// CHECK-NEXT:         }234// CHECK-NEXT:       ]235// CHECK-NEXT:     }236// CHECK-NEXT:   ],237// CHECK-NEXT:   "version": 1238// CHECK-NEXT: }239 240//--- Checks.cpp241// CHECK: {242// CHECK-NEXT:   "revision": 0,243// CHECK-NEXT:   "rules": [244// CHECK-NEXT:     {245// CHECK-NEXT:       "primary-output": "[[PREFIX]]/Impl.o",246// CHECK-NEXT:       "requires": [247// CHECK-NEXT:         {248// CHECK-NEXT:           "logical-name": "M",249// CHECK-NEXT:           "source-path": "[[PREFIX]]/M.cppm"250// CHECK-NEXT:         }251// CHECK-NEXT:       ]252// CHECK-NEXT:     },253// CHECK-NEXT:     {254// CHECK-NEXT:       "primary-output": "[[PREFIX]]/M.o",255// CHECK-NEXT:       "provides": [256// CHECK-NEXT:         {257// CHECK-NEXT:           "is-interface": true,258// CHECK-NEXT:           "logical-name": "M",259// CHECK-NEXT:           "source-path": "[[PREFIX]]/M.cppm"260// CHECK-NEXT:         }261// CHECK-NEXT:       ],262// CHECK-NEXT:       "requires": [263// CHECK-NEXT:         {264// CHECK-NEXT:           "logical-name": "M:interface_part",265// CHECK-NEXT:           "source-path": "[[PREFIX]]/interface_part.cppm"266// CHECK-NEXT:         },267// CHECK-NEXT:         {268// CHECK-NEXT:           "logical-name": "M:impl_part",269// CHECK-NEXT:           "source-path": "[[PREFIX]]/impl_part.cppm"270// CHECK-NEXT:         }271// CHECK-NEXT:       ]272// CHECK-NEXT:     },273// CHECK-NEXT:     {274// CHECK-NEXT:       "primary-output": "[[PREFIX]]/User.o",275// CHECK-NEXT:       "requires": [276// CHECK-NEXT:         {277// CHECK-NEXT:           "logical-name": "M",278// CHECK-NEXT:           "source-path": "[[PREFIX]]/M.cppm"279// CHECK-NEXT:         },280// CHECK-NEXT:         {281// CHECK-NEXT:           "logical-name": "third_party_module"282// CHECK-NEXT:         }283// CHECK-NEXT:       ]284// CHECK-NEXT:     },285// CHECK-NEXT:     {286// CHECK-NEXT:       "primary-output": "[[PREFIX]]/impl_part.o",287// CHECK-NEXT:       "provides": [288// CHECK-NEXT:         {289// CHECK-NEXT:           "is-interface": false,290// CHECK-NEXT:           "logical-name": "M:impl_part",291// CHECK-NEXT:           "source-path": "[[PREFIX]]/impl_part.cppm"292// CHECK-NEXT:         }293// CHECK-NEXT:       ],294// CHECK-NEXT:       "requires": [295// CHECK-NEXT:         {296// CHECK-NEXT:           "logical-name": "M:interface_part",297// CHECK-NEXT:           "source-path": "[[PREFIX]]/interface_part.cppm"298// CHECK-NEXT:         }299// CHECK-NEXT:       ]300// CHECK-NEXT:     },301// CHECK-NEXT:     {302// CHECK-NEXT:       "primary-output": "[[PREFIX]]/interface_part.o",303// CHECK-NEXT:       "provides": [304// CHECK-NEXT:         {305// CHECK-NEXT:           "is-interface": true,306// CHECK-NEXT:           "logical-name": "M:interface_part",307// CHECK-NEXT:           "source-path": "[[PREFIX]]/interface_part.cppm"308// CHECK-NEXT:         }309// CHECK-NEXT:       ]310// CHECK-NEXT:     }311// CHECK-NEXT:   ],312// CHECK-NEXT:   "version": 1313// CHECK-NEXT: }314 315// CHECK-MAKE-DAG: [[PREFIX]]/impl_part.o.ddi: \316// CHECK-MAKE-DAG-NEXT:   [[PREFIX]]/impl_part.cppm \317// CHECK-MAKE-DAG-NEXT:   [[PREFIX]]/header.mock318// CHECK-MAKE-DAG: [[PREFIX]]/interface_part.o.ddi: \319// CHECK-MAKE-DAG-NEXT:   [[PREFIX]]/interface_part.cppm320// CHECK-MAKE-DAG: [[PREFIX]]/M.o.ddi: \321// CHECK-MAKE-DAG-NEXT:   [[PREFIX]]/M.cppm322// CHECK-MAKE-DAG: [[PREFIX]]/User.o.ddi: \323// CHECK-MAKE-DAG-NEXT:   [[PREFIX]]/User.cpp324// CHECK-MAKE-DAG: [[PREFIX]]/Impl.o.ddi: \325// CHECK-MAKE-DAG-NEXT:   [[PREFIX]]/Impl.cpp \326// CHECK-MAKE-DAG-NEXT:   [[PREFIX]]/header.mock327 328//--- module.modulemap329module Mock { header "header.mock" }330 331//--- header.mock332