| // RUN: rm -rf %t |
| // RUN: mkdir -p %t |
| // RUN: split-file %s %t |
| // RUN: %clang_cc1 -std=c++20 %t/foo.cppm -emit-module-interface -o %t/foo.pcm |
| // RUN: %clang_cc1 -std=c++20 -fprebuilt-module-path=%t %t/use.cpp -dump-minimization-hints=%t/decls |
| // RUN: cat %t/decls |
| // RUN: cat %t/decls | FileCheck -check-prefix=RANGE %s |
| // RANGE:{ |
| // RANGE-NEXT:"required_ranges": [ |
| // RANGE-NEXT: { |
| // RANGE-NEXT: "file": "{{.+}}foo.cppm", |
| // RANGE-NEXT: "range": [ |
| // RANGE-NEXT: { |
| // RANGE-NEXT: "from": { |
| // RANGE-NEXT: "line": 3, |
| // RANGE-NEXT: "column": 1 |
| // RANGE-NEXT: }, |
| // RANGE-NEXT: "to": { |
| // RANGE-NEXT: "line": 3, |
| // RANGE-NEXT: "column": 22 |
| // RANGE-NEXT: } |
| // RANGE-NEXT: }, |
| // RANGE-NEXT: { |
| // RANGE-NEXT: "from": { |
| // RANGE-NEXT: "line": 4, |
| // RANGE-NEXT: "column": 3 |
| // RANGE-NEXT: }, |
| // RANGE-NEXT: "to": { |
| // RANGE-NEXT: "line": 4, |
| // RANGE-NEXT: "column": 9 |
| // RANGE-NEXT: } |
| // RANGE-NEXT: }, |
| // RANGE-NEXT: { |
| // RANGE-NEXT: "from": { |
| // RANGE-NEXT: "line": 4, |
| // RANGE-NEXT: "column": 10 |
| // RANGE-NEXT: }, |
| // RANGE-NEXT: "to": { |
| // RANGE-NEXT: "line": 4, |
| // RANGE-NEXT: "column": 43 |
| // RANGE-NEXT: } |
| // RANGE-NEXT: }, |
| // RANGE-NEXT: { |
| // RANGE-NEXT: "from": { |
| // RANGE-NEXT: "line": 6, |
| // RANGE-NEXT: "column": 1 |
| // RANGE-NEXT: }, |
| // RANGE-NEXT: "to": { |
| // RANGE-NEXT: "line": 6, |
| // RANGE-NEXT: "column": 2 |
| // RANGE-NEXT: } |
| // RANGE-NEXT: }, |
| // RANGE-NEXT: { |
| // RANGE-NEXT: "from": { |
| // RANGE-NEXT: "line": 8, |
| // RANGE-NEXT: "column": 1 |
| // RANGE-NEXT: }, |
| // RANGE-NEXT: "to": { |
| // RANGE-NEXT: "line": 8, |
| // RANGE-NEXT: "column": 7 |
| // RANGE-NEXT: } |
| // RANGE-NEXT: }, |
| // RANGE-NEXT: { |
| // RANGE-NEXT: "from": { |
| // RANGE-NEXT: "line": 8, |
| // RANGE-NEXT: "column": 8 |
| // RANGE-NEXT: }, |
| // RANGE-NEXT: "to": { |
| // RANGE-NEXT: "line": 8, |
| // RANGE-NEXT: "column": 25 |
| // RANGE-NEXT: } |
| // RANGE-NEXT: }, |
| // RANGE-NEXT: { |
| // RANGE-NEXT: "from": { |
| // RANGE-NEXT: "line": 9, |
| // RANGE-NEXT: "column": 3 |
| // RANGE-NEXT: }, |
| // RANGE-NEXT: "to": { |
| // RANGE-NEXT: "line": 9, |
| // RANGE-NEXT: "column": 36 |
| // 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": 2 |
| // RANGE-NEXT: } |
| // RANGE-NEXT: } |
| // RANGE-NEXT: ] |
| // RANGE-NEXT: } |
| // RANGE-NEXT:] |
| // RANGE-NEXT:} |
| |
| //--- foo.cppm |
| export module foo; |
| |
| namespace piecemeal { // line 3 |
| export int used(int n) { return n + 1; } |
| export int unused(int n) { return n + 2; } |
| } |
| |
| export namespace whole { // line 8 |
| int used(int n) { return n + 1; } |
| int unused(int n) { return n + 3; } |
| } // line 11 |
| |
| //--- use.cpp |
| import foo; |
| |
| int main() { |
| piecemeal::used(4); // only one of the functions used from each namespace. |
| whole::used(4); |
| } |