// 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: } // 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; } //--- 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; }