From d0f9a87215e0a25c640229d04dcd4b806b1c2433 Mon Sep 17 00:00:00 2001 From: Julie Hockett Date: Mon, 4 Jun 2018 17:22:20 +0000 Subject: [clang-doc] Implement reducer portion of the frontend framework Implements a simple, in-memory reducer for the mapped output of the initial tool. This creates a collection object for storing the deduplicated infos on each declaration, and populates that from the mapper output. The collection object is serialized to LLVM bitstream. On reading each serialized output, it checks to see if a merge is necessary and if so, merges the new info with the existing info (prefering the existing one if conflicts exist). For a more detailed overview of the tool, see the design document on the mailing list: http://lists.llvm.org/pipermail/cfe-dev/2017-December/056203.html Differential Revision: https://reviews.llvm.org/D43341 llvm-svn: 333932 --- clang-tools-extra/test/clang-doc/bc-comment.cpp | 197 +++++++++++++++++ clang-tools-extra/test/clang-doc/bc-namespace.cpp | 109 ++++++++++ clang-tools-extra/test/clang-doc/bc-record.cpp | 254 ++++++++++++++++++++++ 3 files changed, 560 insertions(+) create mode 100644 clang-tools-extra/test/clang-doc/bc-comment.cpp create mode 100644 clang-tools-extra/test/clang-doc/bc-namespace.cpp create mode 100644 clang-tools-extra/test/clang-doc/bc-record.cpp (limited to 'clang-tools-extra/test') diff --git a/clang-tools-extra/test/clang-doc/bc-comment.cpp b/clang-tools-extra/test/clang-doc/bc-comment.cpp new file mode 100644 index 00000000000..f9327804a58 --- /dev/null +++ b/clang-tools-extra/test/clang-doc/bc-comment.cpp @@ -0,0 +1,197 @@ +// RUN: rm -rf %t +// RUN: mkdir %t +// RUN: echo "" > %t/compile_flags.txt +// RUN: cp "%s" "%t/test.cpp" +// RUN: clang-doc --dump-intermediate -doxygen -p %t %t/test.cpp -output=%t/docs +// RUN: llvm-bcanalyzer %t/docs/bc/7574630614A535710E5A6ABCFFF98BCA2D06A4CA.bc --dump | FileCheck %s + +/// \brief Brief description. +/// +/// Extended description that +/// continues onto the next line. +/// +/// +/// +/// \verbatim +/// The description continues. +/// \endverbatim +/// -- +/// \param [out] I is a parameter. +/// \param J is a parameter. +/// \return void +void F(int I, int J); + +/// Bonus comment on definition +void F(int I, int J) {} + +// CHECK: +// CHECK-NEXT: + // CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'F' + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'FullComment' + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'ParagraphComment' + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'TextComment' + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'BlockCommandComment' + // CHECK-NEXT: blob data = 'brief' + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'ParagraphComment' + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'TextComment' + // CHECK-NEXT: blob data = ' Brief description.' + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'ParagraphComment' + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'TextComment' + // CHECK-NEXT: blob data = ' Extended description that' + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'TextComment' + // CHECK-NEXT: blob data = ' continues onto the next line.' + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'ParagraphComment' + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'TextComment' + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'HTMLStartTagComment' + // CHECK-NEXT: blob data = 'ul' + // CHECK-NEXT: blob data = 'class' + // CHECK-NEXT: blob data = 'test' + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'TextComment' + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'HTMLStartTagComment' + // CHECK-NEXT: blob data = 'li' + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'TextComment' + // CHECK-NEXT: blob data = ' Testing.' + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'TextComment' + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'HTMLEndTagComment' + // CHECK-NEXT: blob data = 'ul' + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'ParagraphComment' + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'TextComment' + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'VerbatimBlockComment' + // CHECK-NEXT: blob data = 'verbatim' + // CHECK-NEXT: blob data = 'endverbatim' + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'VerbatimBlockLineComment' + // CHECK-NEXT: blob data = ' The description continues.' + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'ParagraphComment' + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'TextComment' + // CHECK-NEXT: blob data = ' --' + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'TextComment' + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'ParamCommandComment' + // CHECK-NEXT: blob data = '[out]' + // CHECK-NEXT: blob data = 'I' + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'ParagraphComment' + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'TextComment' + // CHECK-NEXT: blob data = ' is a parameter.' + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'TextComment' + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'ParamCommandComment' + // CHECK-NEXT: blob data = '[in]' + // CHECK-NEXT: blob data = 'J' + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'ParagraphComment' + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'TextComment' + // CHECK-NEXT: blob data = ' is a parameter.' + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'TextComment' + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'BlockCommandComment' + // CHECK-NEXT: blob data = 'return' + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'ParagraphComment' + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'TextComment' + // CHECK-NEXT: blob data = ' void' + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'FullComment' + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'ParagraphComment' + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'TextComment' + // CHECK-NEXT: blob data = ' Bonus comment on definition' + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: blob data = '{{.*}}' + // CHECK-NEXT: blob data = '{{.*}}' + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'void' + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'int' + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'I' + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'int' + // CHECK-NEXT: + // CHECK-NEXT: + // CHECK-NEXT: blob data = 'J' + // CHECK-NEXT: +// CHECK-NEXT: diff --git a/clang-tools-extra/test/clang-doc/bc-namespace.cpp b/clang-tools-extra/test/clang-doc/bc-namespace.cpp new file mode 100644 index 00000000000..8c0bab9e089 --- /dev/null +++ b/clang-tools-extra/test/clang-doc/bc-namespace.cpp @@ -0,0 +1,109 @@ +// RUN: rm -rf %t +// RUN: mkdir %t +// RUN: echo "" > %t/compile_flags.txt +// RUN: cp "%s" "%t/test.cpp" +// RUN: clang-doc --dump-intermediate -doxygen -p %t %t/test.cpp -output=%t/docs +// RUN: llvm-bcanalyzer %t/docs/bc/8D042EFFC98B373450BC6B5B90A330C25A150E9C.bc --dump | FileCheck %s --check-prefix CHECK-A +// RUN: llvm-bcanalyzer %t/docs/bc/E21AF79E2A9D02554BA090D10DF39FE273F5CDB5.bc --dump | FileCheck %s --check-prefix CHECK-B +// RUN: llvm-bcanalyzer %t/docs/bc/39D3C95A5F7CE2BA4937BD7B01BAE09EBC2AD8AC.bc --dump | FileCheck %s --check-prefix CHECK-F +// RUN: llvm-bcanalyzer %t/docs/bc/9A82CB33ED0FDF81EE383D31CD0957D153C5E840.bc --dump | FileCheck %s --check-prefix CHECK-FUNC +// RUN: llvm-bcanalyzer %t/docs/bc/E9ABF7E7E2425B626723D41E76E4BC7E7A5BD775.bc --dump | FileCheck %s --check-prefix CHECK-E + +namespace A { +// CHECK-A: + // CHECK-A-NEXT: + // CHECK-A-NEXT: blob data = 'A' +// CHECK-A-NEXT: + +void f(); + +} // namespace A + +namespace A { + +void f(){}; +// CHECK-F: + // CHECK-F-NEXT: + // CHECK-F-NEXT: blob data = 'f' + // CHECK-F-NEXT: + // CHECK-F-NEXT: + // CHECK-F-NEXT: blob data = 'A' + // CHECK-F-NEXT: + // CHECK-F-NEXT: + // CHECK-F-NEXT: + // CHECK-F-NEXT: blob data = '{{.*}}' + // CHECK-F-NEXT: blob data = '{{.*}}' + // CHECK-F-NEXT: + // CHECK-F-NEXT: + // CHECK-F-NEXT: blob data = 'void' + // CHECK-F-NEXT: + // CHECK-F-NEXT: + // CHECK-F-NEXT: +// CHECK-F-NEXT: + +namespace B { +// CHECK-B: + // CHECK-B-NEXT: + // CHECK-B-NEXT: blob data = 'B' + // CHECK-B-NEXT: + // CHECK-B-NEXT: + // CHECK-B-NEXT: blob data = 'A' + // CHECK-B-NEXT: + // CHECK-B-NEXT: + // CHECK-B-NEXT: +// CHECK-B-NEXT: + +enum E { X }; +// CHECK-E: + // CHECK-E-NEXT: + // CHECK-E-NEXT: blob data = 'E' + // CHECK-E-NEXT: + // CHECK-E-NEXT: + // CHECK-E-NEXT: blob data = 'B' + // CHECK-E-NEXT: + // CHECK-E-NEXT: + // CHECK-E-NEXT: + // CHECK-E-NEXT: + // CHECK-E-NEXT: + // CHECK-E-NEXT: blob data = 'A' + // CHECK-E-NEXT: + // CHECK-E-NEXT: + // CHECK-E-NEXT: + // CHECK-E-NEXT: blob data = '{{.*}}' + // CHECK-E-NEXT: blob data = 'X' +// CHECK-E-NEXT: + +E func(int i) { return X; } +// CHECK-FUNC: + // CHECK-FUNC-NEXT: + // CHECK-FUNC-NEXT: blob data = 'func' + // CHECK-FUNC-NEXT: + // CHECK-FUNC-NEXT: + // CHECK-FUNC-NEXT: blob data = 'B' + // CHECK-FUNC-NEXT: + // CHECK-FUNC-NEXT: + // CHECK-FUNC-NEXT: + // CHECK-FUNC-NEXT: + // CHECK-FUNC-NEXT: + // CHECK-FUNC-NEXT: blob data = 'A' + // CHECK-FUNC-NEXT: + // CHECK-FUNC-NEXT: + // CHECK-FUNC-NEXT: + // CHECK-FUNC-NEXT: blob data = '{{.*}}' + // CHECK-FUNC-NEXT: + // CHECK-FUNC-NEXT: + // CHECK-FUNC-NEXT: blob data = 'enum A::B::E' + // CHECK-FUNC-NEXT: + // CHECK-FUNC-NEXT: + // CHECK-FUNC-NEXT: + // CHECK-FUNC-NEXT: + // CHECK-FUNC-NEXT: + // CHECK-FUNC-NEXT: blob data = 'int' + // CHECK-FUNC-NEXT: + // CHECK-FUNC-NEXT: + // CHECK-FUNC-NEXT: blob data = 'i' + // CHECK-FUNC-NEXT: +// CHECK-FUNC-NEXT: + +} // namespace B +} // namespace A diff --git a/clang-tools-extra/test/clang-doc/bc-record.cpp b/clang-tools-extra/test/clang-doc/bc-record.cpp new file mode 100644 index 00000000000..f36e19e8961 --- /dev/null +++ b/clang-tools-extra/test/clang-doc/bc-record.cpp @@ -0,0 +1,254 @@ +// This test requires Linux due to the system-dependent USR for the +// inner class in function H. +// REQUIRES: system-linux +// RUN: rm -rf %t +// RUN: mkdir %t +// RUN: echo "" > %t/compile_flags.txt +// RUN: cp "%s" "%t/test.cpp" +// RUN: clang-doc --dump-intermediate -doxygen -p %t %t/test.cpp -output=%t/docs +// RUN: llvm-bcanalyzer %t/docs/bc/ACE81AFA6627B4CEF2B456FB6E1252925674AF7E.bc --dump | FileCheck %s --check-prefix CHECK-A +// RUN: llvm-bcanalyzer %t/docs/bc/FC07BD34D5E77782C263FA944447929EA8753740.bc --dump | FileCheck %s --check-prefix CHECK-B +// RUN: llvm-bcanalyzer %t/docs/bc/1E3438A08BA22025C0B46289FF0686F92C8924C5.bc --dump | FileCheck %s --check-prefix CHECK-BC +// RUN: llvm-bcanalyzer %t/docs/bc/06B5F6A19BA9F6A832E127C9968282B94619B210.bc --dump | FileCheck %s --check-prefix CHECK-C +// RUN: llvm-bcanalyzer %t/docs/bc/0921737541208B8FA9BB42B60F78AC1D779AA054.bc --dump | FileCheck %s --check-prefix CHECK-D +// RUN: llvm-bcanalyzer %t/docs/bc/289584A8E0FF4178A794622A547AA622503967A1.bc --dump | FileCheck %s --check-prefix CHECK-E +// RUN: llvm-bcanalyzer %t/docs/bc/DEB4AC1CD9253CD9EF7FBE6BCAC506D77984ABD4.bc --dump | FileCheck %s --check-prefix CHECK-ECON +// RUN: llvm-bcanalyzer %t/docs/bc/BD2BDEBD423F80BACCEA75DE6D6622D355FC2D17.bc --dump | FileCheck %s --check-prefix CHECK-EDES +// RUN: llvm-bcanalyzer %t/docs/bc/E3B54702FABFF4037025BA194FC27C47006330B5.bc --dump | FileCheck %s --check-prefix CHECK-F +// RUN: llvm-bcanalyzer %t/docs/bc/B6AC4C5C9F2EA3F2B3ECE1A33D349F4EE502B24E.bc --dump | FileCheck %s --check-prefix CHECK-H +// RUN: llvm-bcanalyzer %t/docs/bc/6BA1EE2B3DAEACF6E4306F10AF44908F4807927C.bc --dump | FileCheck %s --check-prefix CHECK-I +// RUN: llvm-bcanalyzer %t/docs/bc/5093D428CDC62096A67547BA52566E4FB9404EEE.bc --dump | FileCheck %s --check-prefix CHECK-PM +// RUN: llvm-bcanalyzer %t/docs/bc/CA7C7935730B5EACD25F080E9C83FA087CCDC75E.bc --dump | FileCheck %s --check-prefix CHECK-X +// RUN: llvm-bcanalyzer %t/docs/bc/641AB4A3D36399954ACDE29C7A8833032BF40472.bc --dump | FileCheck %s --check-prefix CHECK-Y + +void H() { + class I {}; +} +// CHECK-H: + // CHECK-H-NEXT: + // CHECK-H-NEXT: blob data = 'H' + // CHECK-H-NEXT: blob data = '{{.*}}' + // CHECK-H-NEXT: + // CHECK-H-NEXT: + // CHECK-H-NEXT: blob data = 'void' + // CHECK-H-NEXT: + // CHECK-H-NEXT: + // CHECK-H-NEXT: +// CHECK-H-NEXT: + + +// CHECK-I: + // CHECK-I-NEXT: + // CHECK-I-NEXT: blob data = 'I' + // CHECK-I-NEXT: + // CHECK-I-NEXT: + // CHECK-I-NEXT: blob data = 'H' + // CHECK-I-NEXT: + // CHECK-I-NEXT: + // CHECK-I-NEXT: + // CHECK-I-NEXT: blob data = '{{.*}}' + // CHECK-I-NEXT: +// CHECK-I-NEXT: + +union A { int X; int Y; }; +// CHECK-A: + // CHECK-A-NEXT: + // CHECK-A-NEXT: blob data = 'A' + // CHECK-A-NEXT: blob data = '{{.*}}' + // CHECK-A-NEXT: + // CHECK-A-NEXT: + // CHECK-A-NEXT: + // CHECK-A-NEXT: blob data = 'int' + // CHECK-A-NEXT: + // CHECK-A-NEXT: + // CHECK-A-NEXT: blob data = 'X' + // CHECK-A-NEXT: + // CHECK-A-NEXT: + // CHECK-A-NEXT: + // CHECK-A-NEXT: + // CHECK-A-NEXT: blob data = 'int' + // CHECK-A-NEXT: + // CHECK-A-NEXT: + // CHECK-A-NEXT: blob data = 'Y' + // CHECK-A-NEXT: + // CHECK-A-NEXT: +// CHECK-A-NEXT: + +enum B { X, Y }; +// CHECK-B: + // CHECK-B-NEXT: + // CHECK-B-NEXT: blob data = 'B' + // CHECK-B-NEXT: blob data = '{{.*}}' + // CHECK-B-NEXT: blob data = 'X' + // CHECK-B-NEXT: blob data = 'Y' +// CHECK-B-NEXT: + +enum class Bc { A, B }; +// CHECK-BC: + // CHECK-BC-NEXT: + // CHECK-BC-NEXT: blob data = 'Bc' + // CHECK-BC-NEXT: blob data = '{{.*}}' + // CHECK-BC-NEXT: + // CHECK-BC-NEXT: blob data = 'A' + // CHECK-BC-NEXT: blob data = 'B' +// CHECK-BC-NEXT: + +struct C { int i; }; +// CHECK-C: + // CHECK-C-NEXT: + // CHECK-C-NEXT: blob data = 'C' + // CHECK-C-NEXT: blob data = '{{.*}}' + // CHECK-C-NEXT: + // CHECK-C-NEXT: + // CHECK-C-NEXT: blob data = 'int' + // CHECK-C-NEXT: + // CHECK-C-NEXT: + // CHECK-C-NEXT: blob data = 'i' + // CHECK-C-NEXT: + // CHECK-C-NEXT: +// CHECK-C-NEXT: + +class D {}; +// CHECK-D: + // CHECK-D-NEXT: + // CHECK-D-NEXT: blob data = 'D' + // CHECK-D-NEXT: blob data = '{{.*}}' + // CHECK-D-NEXT: +// CHECK-D-NEXT: + +class E { +public: + E() {} + ~E() {} + +protected: + void ProtectedMethod(); +}; +// CHECK-E: + // CHECK-E-NEXT: + // CHECK-E-NEXT: blob data = 'E' + // CHECK-E-NEXT: blob data = '{{.*}}' + // CHECK-E-NEXT: +// CHECK-E-NEXT: + +// CHECK-ECON: + // CHECK-ECON-NEXT: + // CHECK-ECON-NEXT: blob data = 'E' + // CHECK-ECON-NEXT: + // CHECK-ECON-NEXT: + // CHECK-ECON-NEXT: blob data = 'E' + // CHECK-ECON-NEXT: + // CHECK-ECON-NEXT: + // CHECK-ECON-NEXT: + // CHECK-ECON-NEXT: + // CHECK-ECON-NEXT: blob data = '{{.*}}' + // CHECK-ECON-NEXT: + // CHECK-ECON-NEXT: + // CHECK-ECON-NEXT: blob data = 'E' + // CHECK-ECON-NEXT: + // CHECK-ECON-NEXT: + // CHECK-ECON-NEXT: + // CHECK-ECON-NEXT: + // CHECK-ECON-NEXT: + // CHECK-ECON-NEXT: blob data = 'void' + // CHECK-ECON-NEXT: + // CHECK-ECON-NEXT: + // CHECK-ECON-NEXT: +// CHECK-ECON-NEXT: + +// CHECK-EDES: + // CHECK-EDES-NEXT: + // CHECK-EDES-NEXT: blob data = '~E' + // CHECK-EDES-NEXT: + // CHECK-EDES-NEXT: + // CHECK-EDES-NEXT: blob data = 'E' + // CHECK-EDES-NEXT: + // CHECK-EDES-NEXT: + // CHECK-EDES-NEXT: + // CHECK-EDES-NEXT: + // CHECK-EDES-NEXT: blob data = '{{.*}}' + // CHECK-EDES-NEXT: + // CHECK-EDES-NEXT: + // CHECK-EDES-NEXT: blob data = 'E' + // CHECK-EDES-NEXT: + // CHECK-EDES-NEXT: + // CHECK-EDES-NEXT: + // CHECK-EDES-NEXT: + // CHECK-EDES-NEXT: + // CHECK-EDES-NEXT: blob data = 'void' + // CHECK-EDES-NEXT: + // CHECK-EDES-NEXT: + // CHECK-EDES-NEXT: +// CHECK-EDES-NEXT: + +void E::ProtectedMethod() {} +// CHECK-PM: + // CHECK-PM-NEXT: + // CHECK-PM-NEXT: blob data = 'ProtectedMethod' + // CHECK-PM-NEXT: + // CHECK-PM-NEXT: + // CHECK-PM-NEXT: blob data = 'E' + // CHECK-PM-NEXT: + // CHECK-PM-NEXT: + // CHECK-PM-NEXT: + // CHECK-PM-NEXT: + // CHECK-PM-NEXT: blob data = '{{.*}}' + // CHECK-PM-NEXT: blob data = '{{.*}}' + // CHECK-PM-NEXT: + // CHECK-PM-NEXT: + // CHECK-PM-NEXT: blob data = 'E' + // CHECK-PM-NEXT: + // CHECK-PM-NEXT: + // CHECK-PM-NEXT: + // CHECK-PM-NEXT: + // CHECK-PM-NEXT: + // CHECK-PM-NEXT: blob data = 'void' + // CHECK-PM-NEXT: + // CHECK-PM-NEXT: + // CHECK-PM-NEXT: +// CHECK-PM-NEXT: + + + +class F : virtual private D, public E {}; +// CHECK-F: + // CHECK-F-NEXT: + // CHECK-F-NEXT: blob data = 'F' + // CHECK-F-NEXT: blob data = '{{.*}}' + // CHECK-F-NEXT: + // CHECK-F-NEXT: + // CHECK-F-NEXT: + // CHECK-F-NEXT: blob data = 'E' + // CHECK-F-NEXT: + // CHECK-F-NEXT: + // CHECK-F-NEXT: + // CHECK-F-NEXT: + // CHECK-F-NEXT: + // CHECK-F-NEXT: blob data = 'D' + // CHECK-F-NEXT: + // CHECK-F-NEXT: + // CHECK-F-NEXT: +// CHECK-F-NEXT: + +class X { + class Y {}; +}; +// CHECK-X: + // CHECK-X-NEXT: + // CHECK-X-NEXT: blob data = 'X' + // CHECK-X-NEXT: blob data = '{{.*}}' + // CHECK-X-NEXT: +// CHECK-X-NEXT: + +// CHECK-Y: + // CHECK-Y-NEXT: + // CHECK-Y-NEXT: blob data = 'Y' + // CHECK-Y-NEXT: + // CHECK-Y-NEXT: + // CHECK-Y-NEXT: blob data = 'X' + // CHECK-Y-NEXT: + // CHECK-Y-NEXT: + // CHECK-Y-NEXT: + // CHECK-Y-NEXT: blob data = '{{.*}}' + // CHECK-Y-NEXT: +// CHECK-Y-NEXT: -- cgit v1.2.1