annotate clang/unittests/Lex/PPDependencyDirectivesTest.cpp @ 266:00f31e85ec16 default tip

Added tag current for changeset 31d058e83c98
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 14 Oct 2023 10:13:55 +0900
parents 1f2b6ac9f198
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
236
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
1 //===- unittests/Lex/PPDependencyDirectivesTest.cpp -------------------------=//
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
2 //
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
6 //
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
8
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
9 #include "clang/Basic/Diagnostic.h"
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
10 #include "clang/Basic/DiagnosticOptions.h"
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
11 #include "clang/Basic/FileManager.h"
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
12 #include "clang/Basic/LangOptions.h"
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
13 #include "clang/Basic/SourceManager.h"
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
14 #include "clang/Basic/TargetInfo.h"
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
15 #include "clang/Basic/TargetOptions.h"
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
16 #include "clang/Lex/DependencyDirectivesScanner.h"
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
17 #include "clang/Lex/HeaderSearch.h"
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
18 #include "clang/Lex/HeaderSearchOptions.h"
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
19 #include "clang/Lex/ModuleLoader.h"
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
20 #include "clang/Lex/Preprocessor.h"
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
21 #include "clang/Lex/PreprocessorOptions.h"
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
22 #include "llvm/Testing/Support/Error.h"
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
23 #include "gtest/gtest.h"
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
24 #include <optional>
236
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
25
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
26 using namespace clang;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
27
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
28 namespace {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
29
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
30 // The test fixture.
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
31 class PPDependencyDirectivesTest : public ::testing::Test {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
32 protected:
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
33 PPDependencyDirectivesTest()
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
34 : FileMgr(FileMgrOpts), DiagID(new DiagnosticIDs()),
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
35 Diags(DiagID, new DiagnosticOptions, new IgnoringDiagConsumer()),
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
36 SourceMgr(Diags, FileMgr), TargetOpts(new TargetOptions) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
37 TargetOpts->Triple = "x86_64-apple-macos12";
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
38 Target = TargetInfo::CreateTargetInfo(Diags, TargetOpts);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
39 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
40
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
41 FileSystemOptions FileMgrOpts;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
42 FileManager FileMgr;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
43 IntrusiveRefCntPtr<DiagnosticIDs> DiagID;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
44 DiagnosticsEngine Diags;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
45 SourceManager SourceMgr;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
46 LangOptions LangOpts;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
47 std::shared_ptr<TargetOptions> TargetOpts;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
48 IntrusiveRefCntPtr<TargetInfo> Target;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
49 };
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
50
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
51 class IncludeCollector : public PPCallbacks {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
52 public:
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
53 Preprocessor &PP;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
54 SmallVectorImpl<StringRef> &IncludedFiles;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
55
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
56 IncludeCollector(Preprocessor &PP, SmallVectorImpl<StringRef> &IncludedFiles)
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
57 : PP(PP), IncludedFiles(IncludedFiles) {}
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
58
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
59 void LexedFileChanged(FileID FID, LexedFileChangeReason Reason,
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
60 SrcMgr::CharacteristicKind FileType, FileID PrevFID,
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
61 SourceLocation Loc) override {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
62 if (Reason != LexedFileChangeReason::EnterFile)
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
63 return;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
64 if (FID == PP.getPredefinesFileID())
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
65 return;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
66 StringRef Filename =
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
67 PP.getSourceManager().getSLocEntry(FID).getFile().getName();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
68 IncludedFiles.push_back(Filename);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
69 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
70 };
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
71
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
72 TEST_F(PPDependencyDirectivesTest, MacroGuard) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
73 // "head1.h" has a macro guard and should only be included once.
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
74 // "head2.h" and "head3.h" have tokens following the macro check, they should
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
75 // be included multiple times.
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
76
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
77 auto VFS = new llvm::vfs::InMemoryFileSystem();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
78 VFS->addFile(
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
79 "head1.h", 0,
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
80 llvm::MemoryBuffer::getMemBuffer("#ifndef H1_H\n#define H1_H\n#endif\n"));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
81 VFS->addFile(
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
82 "head2.h", 0,
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
83 llvm::MemoryBuffer::getMemBuffer("#ifndef H2_H\n#define H2_H\n#endif\n\n"
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
84 "extern int foo;\n"));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
85 VFS->addFile("head3.h", 0,
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
86 llvm::MemoryBuffer::getMemBuffer(
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
87 "#ifndef H3_H\n#define H3_H\n#endif\n\n"
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
88 "#ifdef SOMEMAC\nextern int foo;\n#endif\n"));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
89 VFS->addFile("main.c", 0,
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
90 llvm::MemoryBuffer::getMemBuffer(
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
91 "#include \"head1.h\"\n#include \"head1.h\"\n"
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
92 "#include \"head2.h\"\n#include \"head2.h\"\n"
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
93 "#include \"head3.h\"\n#include \"head3.h\"\n"));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
94 FileMgr.setVirtualFileSystem(VFS);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
95
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
96 OptionalFileEntryRef FE;
236
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
97 ASSERT_THAT_ERROR(FileMgr.getFileRef("main.c").moveInto(FE),
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
98 llvm::Succeeded());
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
99 SourceMgr.setMainFileID(
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
100 SourceMgr.createFileID(*FE, SourceLocation(), SrcMgr::C_User));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
101
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
102 struct DepDirectives {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
103 SmallVector<dependency_directives_scan::Token> Tokens;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
104 SmallVector<dependency_directives_scan::Directive> Directives;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
105 };
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
106 SmallVector<std::unique_ptr<DepDirectives>> DepDirectivesObjects;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
107
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
108 auto getDependencyDirectives = [&](FileEntryRef File)
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
109 -> std::optional<ArrayRef<dependency_directives_scan::Directive>> {
236
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
110 DepDirectivesObjects.push_back(std::make_unique<DepDirectives>());
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
111 StringRef Input = (*FileMgr.getBufferForFile(File))->getBuffer();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
112 bool Err = scanSourceForDependencyDirectives(
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
113 Input, DepDirectivesObjects.back()->Tokens,
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
114 DepDirectivesObjects.back()->Directives);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
115 EXPECT_FALSE(Err);
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
116 return llvm::ArrayRef(DepDirectivesObjects.back()->Directives);
236
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
117 };
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
118
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
119 auto PPOpts = std::make_shared<PreprocessorOptions>();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
120 PPOpts->DependencyDirectivesForFile = [&](FileEntryRef File)
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
121 -> std::optional<ArrayRef<dependency_directives_scan::Directive>> {
236
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
122 return getDependencyDirectives(File);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
123 };
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
124
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
125 TrivialModuleLoader ModLoader;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
126 HeaderSearch HeaderInfo(std::make_shared<HeaderSearchOptions>(), SourceMgr,
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
127 Diags, LangOpts, Target.get());
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
128 Preprocessor PP(PPOpts, Diags, LangOpts, SourceMgr, HeaderInfo, ModLoader,
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
129 /*IILookup =*/nullptr,
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
130 /*OwnsHeaderSearch =*/false);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
131 PP.Initialize(*Target);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
132
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
133 SmallVector<StringRef> IncludedFiles;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
134 PP.addPPCallbacks(std::make_unique<IncludeCollector>(PP, IncludedFiles));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
135 PP.EnterMainSourceFile();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
136 while (true) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
137 Token tok;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
138 PP.Lex(tok);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
139 if (tok.is(tok::eof))
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
140 break;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
141 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
142
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
143 SmallVector<StringRef> ExpectedIncludes{
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
144 "main.c", "./head1.h", "./head2.h", "./head2.h", "./head3.h", "./head3.h",
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
145 };
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
146 EXPECT_EQ(IncludedFiles, ExpectedIncludes);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
147 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
148
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
149 } // anonymous namespace