157 lines · cpp
1// RUN: rm -rf %t2// RUN: mkdir -p %t3// RUN: split-file %s %t4// RUN: %clang_cc1 -xc++ -fmodules -fmodule-name=foo -fmodule-map-file=%t/foo.cppmap -emit-module %t/foo.cppmap -o %t/foo.pcm5// RUN: %clang_cc1 -xc++ -fmodules -dump-minimization-hints=%t/decls -fmodule-file=%t/foo.pcm %t/foo.cpp -o %t/foo.o6// RUN: cat %t/decls7// RUN: cat %t/decls | FileCheck -check-prefix=RANGE %s8// RANGE:{9// RANGE-NEXT: "required_ranges": [10// RANGE-NEXT: {11// RANGE-NEXT: "file": "{{.+}}foo.h",12// RANGE-NEXT: "range": [13// RANGE-NEXT: {14// RANGE-NEXT: "from": {15// RANGE-NEXT: "line": 1,16// RANGE-NEXT: "column": 117// RANGE-NEXT: },18// RANGE-NEXT: "to": {19// RANGE-NEXT: "line": 9,20// RANGE-NEXT: "column": 321// RANGE-NEXT: }22// RANGE-NEXT: },23// RANGE-NEXT: {24// RANGE-NEXT: "from": {25// RANGE-NEXT: "line": 11,26// RANGE-NEXT: "column": 127// RANGE-NEXT: },28// RANGE-NEXT: "to": {29// RANGE-NEXT: "line": 11,30// RANGE-NEXT: "column": 2531// RANGE-NEXT: }32// RANGE-NEXT: },33// RANGE-NEXT: {34// RANGE-NEXT: "from": {35// RANGE-NEXT: "line": 13,36// RANGE-NEXT: "column": 137// RANGE-NEXT: },38// RANGE-NEXT: "to": {39// RANGE-NEXT: "line": 15,40// RANGE-NEXT: "column": 241// RANGE-NEXT: }42// RANGE-NEXT: },43// RANGE-NEXT: {44// RANGE-NEXT: "from": {45// RANGE-NEXT: "line": 19,46// RANGE-NEXT: "column": 147// RANGE-NEXT: },48// RANGE-NEXT: "to": {49// RANGE-NEXT: "line": 19,50// RANGE-NEXT: "column": 4151// RANGE-NEXT: }52// RANGE-NEXT: },53// RANGE-NEXT: {54// RANGE-NEXT: "from": {55// RANGE-NEXT: "line": 20,56// RANGE-NEXT: "column": 157// RANGE-NEXT: },58// RANGE-NEXT: "to": {59// RANGE-NEXT: "line": 23,60// RANGE-NEXT: "column": 261// RANGE-NEXT: }62// RANGE-NEXT: },63// RANGE-NEXT: {64// RANGE-NEXT: "from": {65// RANGE-NEXT: "line": 31,66// RANGE-NEXT: "column": 167// RANGE-NEXT: },68// RANGE-NEXT: "to": {69// RANGE-NEXT: "line": 31,70// RANGE-NEXT: "column": 2771// RANGE-NEXT: }72// RANGE-NEXT: },73// RANGE-NEXT: {74// RANGE-NEXT: "from": {75// RANGE-NEXT: "line": 32,76// RANGE-NEXT: "column": 377// RANGE-NEXT: },78// RANGE-NEXT: "to": {79// RANGE-NEXT: "line": 32,80// RANGE-NEXT: "column": 1281// RANGE-NEXT: }82// RANGE-NEXT: },83// RANGE-NEXT: {84// RANGE-NEXT: "from": {85// RANGE-NEXT: "line": 34,86// RANGE-NEXT: "column": 187// RANGE-NEXT: },88// RANGE-NEXT: "to": {89// RANGE-NEXT: "line": 34,90// RANGE-NEXT: "column": 291// RANGE-NEXT: }92// RANGE-NEXT: }93// RANGE-NEXT: ]94// RANGE-NEXT: }95// RANGE-NEXT: ]96// RANGE-NEXT:}97 98//--- foo.cppmap99module foo {100 header "foo.h"101 export *102}103 104//--- foo.h105class MyData {106public:107 MyData(int val): value_(val) {}108 int getValue() const {109 return 5;110 }111private:112 int value_;113};114 115extern int global_value;116 117int multiply(int a, int b) {118 return a * b;119}120 121inline void unused_by_foo() {} // line 17122 123inline void recursively_used_by_foo() {} // line 19124inline int used_by_foo() { // line 20125 recursively_used_by_foo();126 return 1;127}128 129struct UnusedByFoo {};130 131namespace ns_unused_by_foo {132 void x();133}134 135namespace ns_used_by_foo { // line 31136 void x(); // line 32137 void unused_y(); 138} // line 34139 140// Does not have any declarations that are used, so 141// will not be marked as used.142namespace ns_used_by_foo { 143 void unused_z();144}145//--- foo.cpp146#include "foo.h"147int global_value = 5;148int main() {149 MyData data(5);150 int current_value = data.getValue();151 int doubled_value = multiply(current_value, 2);152 int final_result = doubled_value + global_value;153 154 used_by_foo();155 ns_used_by_foo::x();156}157