// RUN: rm -rf %t // RUN: mkdir -p %t // RUN: split-file %s %t // RUN: %clang_cc1 -xc++ -fmodules -fmodule-name=foo -fmodule-map-file=%t/foo.cppmap -emit-module %t/foo.cppmap -o %t/foo.pcm // RUN: %clang_cc1 -xc++ -fmodules -dump-minimization-hints=%t/decls -fmodule-file=%t/foo.pcm %t/foo.cpp -o %t/foo.o // RUN: cat %t/decls // RUN: cat %t/decls | FileCheck -check-prefix=RANGE %s // RANGE:{ // RANGE-NEXT: "required_ranges": [ // RANGE-NEXT: { // RANGE-NEXT: "file": "{{.+}}foo.h", // RANGE-NEXT: "range": [ // RANGE-NEXT: { // RANGE-NEXT: "from": { // RANGE-NEXT: "line": 1, // RANGE-NEXT: "column": 1 // RANGE-NEXT: }, // RANGE-NEXT: "to": { // RANGE-NEXT: "line": 9, // RANGE-NEXT: "column": 3 // RANGE-NEXT: } // RANGE-NEXT: }, // RANGE-NEXT: { // RANGE-NEXT: "from": { // RANGE-NEXT: "line": 11, // RANGE-NEXT: "column": 1 // RANGE-NEXT: }, // RANGE-NEXT: "to": { // RANGE-NEXT: "line": 11, // RANGE-NEXT: "column": 25 // RANGE-NEXT: } // RANGE-NEXT: }, // RANGE-NEXT: { // RANGE-NEXT: "from": { // RANGE-NEXT: "line": 13, // RANGE-NEXT: "column": 1 // RANGE-NEXT: }, // RANGE-NEXT: "to": { // RANGE-NEXT: "line": 15, // RANGE-NEXT: "column": 2 // RANGE-NEXT: } // RANGE-NEXT: }, // RANGE-NEXT: { // RANGE-NEXT: "from": { // RANGE-NEXT: "line": 19, // RANGE-NEXT: "column": 1 // RANGE-NEXT: }, // RANGE-NEXT: "to": { // RANGE-NEXT: "line": 19, // RANGE-NEXT: "column": 41 // RANGE-NEXT: } // RANGE-NEXT: }, // RANGE-NEXT: { // RANGE-NEXT: "from": { // RANGE-NEXT: "line": 20, // RANGE-NEXT: "column": 1 // RANGE-NEXT: }, // RANGE-NEXT: "to": { // RANGE-NEXT: "line": 23, // RANGE-NEXT: "column": 2 // RANGE-NEXT: } // RANGE-NEXT: }, // RANGE-NEXT: { // RANGE-NEXT: "from": { // RANGE-NEXT: "line": 31, // RANGE-NEXT: "column": 1 // RANGE-NEXT: }, // RANGE-NEXT: "to": { // RANGE-NEXT: "line": 31, // RANGE-NEXT: "column": 27 // RANGE-NEXT: } // RANGE-NEXT: }, // RANGE-NEXT: { // RANGE-NEXT: "from": { // RANGE-NEXT: "line": 32, // RANGE-NEXT: "column": 3 // RANGE-NEXT: }, // RANGE-NEXT: "to": { // RANGE-NEXT: "line": 32, // RANGE-NEXT: "column": 12 // RANGE-NEXT: } // RANGE-NEXT: }, // RANGE-NEXT: { // RANGE-NEXT: "from": { // RANGE-NEXT: "line": 34, // RANGE-NEXT: "column": 1 // RANGE-NEXT: }, // RANGE-NEXT: "to": { // RANGE-NEXT: "line": 34, // RANGE-NEXT: "column": 2 // RANGE-NEXT: } // RANGE-NEXT: } // RANGE-NEXT: ] // RANGE-NEXT: } // RANGE-NEXT: ] // RANGE-NEXT:} //--- foo.cppmap module foo { header "foo.h" export * } //--- foo.h class MyData { public: MyData(int val): value_(val) {} int getValue() const { return 5; } private: int value_; }; extern int global_value; int multiply(int a, int b) { return a * b; } inline void unused_by_foo() {} // line 17 inline void recursively_used_by_foo() {} // line 19 inline int used_by_foo() { // line 20 recursively_used_by_foo(); return 1; } struct UnusedByFoo {}; namespace ns_unused_by_foo { void x(); } namespace ns_used_by_foo { // line 31 void x(); // line 32 void unused_y(); } // line 34 // Does not have any declarations that are used, so // will not be marked as used. namespace ns_used_by_foo { void unused_z(); } //--- foo.cpp #include "foo.h" int global_value = 5; int main() { MyData data(5); int current_value = data.getValue(); int doubled_value = multiply(current_value, 2); int final_result = doubled_value + global_value; used_by_foo(); ns_used_by_foo::x(); }