7
7
// ===----------------------------------------------------------------------===//
8
8
9
9
#include " clang/Lex/DependencyDirectivesScanner.h"
10
+ #include " clang/Basic/TokenKinds.h"
10
11
#include " llvm/ADT/SmallString.h"
11
12
#include " gtest/gtest.h"
12
13
@@ -17,11 +18,11 @@ using namespace clang::dependency_directives_scan;
17
18
static bool minimizeSourceToDependencyDirectives (
18
19
StringRef Input, SmallVectorImpl<char > &Out,
19
20
SmallVectorImpl<dependency_directives_scan::Token> &Tokens,
20
- SmallVectorImpl<Directive> &Directives) {
21
+ SmallVectorImpl<Directive> &Directives, const LangOptions &LangOpts ) {
21
22
Out.clear ();
22
23
Tokens.clear ();
23
24
Directives.clear ();
24
- if (scanSourceForDependencyDirectives (Input, Tokens, Directives))
25
+ if (scanSourceForDependencyDirectives (Input, Tokens, Directives, LangOpts ))
25
26
return true ;
26
27
27
28
raw_svector_ostream OS (Out);
@@ -38,7 +39,9 @@ static bool minimizeSourceToDependencyDirectives(StringRef Input,
38
39
SmallVectorImpl<char > &Out) {
39
40
SmallVector<dependency_directives_scan::Token, 16 > Tokens;
40
41
SmallVector<Directive, 32 > Directives;
41
- return minimizeSourceToDependencyDirectives (Input, Out, Tokens, Directives);
42
+ LangOptions LangOpts;
43
+ return minimizeSourceToDependencyDirectives (Input, Out, Tokens, Directives,
44
+ LangOpts);
42
45
}
43
46
44
47
namespace {
@@ -47,16 +50,17 @@ TEST(MinimizeSourceToDependencyDirectivesTest, Empty) {
47
50
SmallVector<char , 128 > Out;
48
51
SmallVector<dependency_directives_scan::Token, 4 > Tokens;
49
52
SmallVector<Directive, 4 > Directives;
53
+ LangOptions LangOpts;
50
54
51
- ASSERT_FALSE (
52
- minimizeSourceToDependencyDirectives ( " " , Out, Tokens, Directives ));
55
+ ASSERT_FALSE (minimizeSourceToDependencyDirectives ( " " , Out, Tokens, Directives,
56
+ LangOpts ));
53
57
EXPECT_TRUE (Out.empty ());
54
58
EXPECT_TRUE (Tokens.empty ());
55
59
ASSERT_EQ (1u , Directives.size ());
56
60
ASSERT_EQ (pp_eof, Directives.back ().Kind );
57
61
58
62
ASSERT_FALSE (minimizeSourceToDependencyDirectives (" abc def\n xyz" , Out, Tokens,
59
- Directives));
63
+ Directives, LangOpts ));
60
64
EXPECT_STREQ (" <TokBeforeEOF>\n " , Out.data ());
61
65
EXPECT_TRUE (Tokens.empty ());
62
66
ASSERT_EQ (2u , Directives.size ());
@@ -68,6 +72,7 @@ TEST(MinimizeSourceToDependencyDirectivesTest, AllTokens) {
68
72
SmallVector<char , 128 > Out;
69
73
SmallVector<dependency_directives_scan::Token, 4 > Tokens;
70
74
SmallVector<Directive, 4 > Directives;
75
+ LangOptions LangOpts;
71
76
72
77
ASSERT_FALSE (
73
78
minimizeSourceToDependencyDirectives (" #define A\n "
@@ -92,7 +97,7 @@ TEST(MinimizeSourceToDependencyDirectivesTest, AllTokens) {
92
97
" export module m;\n "
93
98
" import m;\n "
94
99
" #pragma clang system_header\n " ,
95
- Out, Tokens, Directives));
100
+ Out, Tokens, Directives, LangOpts ));
96
101
EXPECT_EQ (pp_define, Directives[0 ].Kind );
97
102
EXPECT_EQ (pp_undef, Directives[1 ].Kind );
98
103
EXPECT_EQ (pp_endif, Directives[2 ].Kind );
@@ -145,9 +150,10 @@ TEST(MinimizeSourceToDependencyDirectivesTest, Define) {
145
150
SmallVector<char , 128 > Out;
146
151
SmallVector<dependency_directives_scan::Token, 4 > Tokens;
147
152
SmallVector<Directive, 4 > Directives;
153
+ LangOptions LangOpts;
148
154
149
- ASSERT_FALSE (minimizeSourceToDependencyDirectives (" #define MACRO " , Out,
150
- Tokens, Directives));
155
+ ASSERT_FALSE (minimizeSourceToDependencyDirectives (
156
+ " #define MACRO " , Out, Tokens, Directives, LangOpts ));
151
157
EXPECT_STREQ (" #define MACRO\n " , Out.data ());
152
158
ASSERT_EQ (4u , Tokens.size ());
153
159
ASSERT_EQ (2u , Directives.size ());
@@ -838,15 +844,16 @@ TEST(MinimizeSourceToDependencyDirectivesTest, PragmaOnce) {
838
844
SmallVector<char , 128 > Out;
839
845
SmallVector<dependency_directives_scan::Token, 4 > Tokens;
840
846
SmallVector<Directive, 4 > Directives;
847
+ LangOptions LangOpts;
841
848
842
849
StringRef Source = R"( // comment
843
850
#pragma once
844
851
// another comment
845
852
#include <test.h>
846
853
_Pragma("once")
847
854
)" ;
848
- ASSERT_FALSE (
849
- minimizeSourceToDependencyDirectives (Source, Out, Tokens, Directives));
855
+ ASSERT_FALSE (minimizeSourceToDependencyDirectives (Source, Out, Tokens,
856
+ Directives, LangOpts ));
850
857
EXPECT_STREQ (" #pragma once\n #include <test.h>\n _Pragma(\" once\" )\n " ,
851
858
Out.data ());
852
859
ASSERT_EQ (Directives.size (), 4u );
@@ -926,6 +933,7 @@ TEST(MinimizeSourceToDependencyDirectivesTest, CxxModules) {
926
933
SmallVector<char , 128 > Out;
927
934
SmallVector<dependency_directives_scan::Token, 4 > Tokens;
928
935
SmallVector<Directive, 4 > Directives;
936
+ LangOptions LangOpts;
929
937
930
938
StringRef Source = R"(
931
939
module;
@@ -954,8 +962,8 @@ ort \
954
962
import f(->a = 3);
955
963
}
956
964
)" ;
957
- ASSERT_FALSE (
958
- minimizeSourceToDependencyDirectives (Source, Out, Tokens, Directives));
965
+ ASSERT_FALSE (minimizeSourceToDependencyDirectives (Source, Out, Tokens,
966
+ Directives, LangOpts ));
959
967
EXPECT_STREQ (" #include \" textual-header.h\"\n export module m;"
960
968
" exp\\\n ort import:l[[rename]];"
961
969
" import<<=3;import a b d e d e f e;"
@@ -1012,4 +1020,52 @@ TEST(MinimizeSourceToDependencyDirectivesTest, TokensBeforeEOF) {
1012
1020
EXPECT_STREQ (" #ifndef A\n #define A\n #endif\n <TokBeforeEOF>\n " , Out.data ());
1013
1021
}
1014
1022
1023
+ TEST (MinimizeSourceToDependencyDirectivesTest, CPlusPlus14PPNumber) {
1024
+ SmallVector<char , 128 > Out;
1025
+ SmallVector<dependency_directives_scan::Token, 4 > Tokens;
1026
+ SmallVector<Directive, 4 > Directives;
1027
+ LangOptions LangOpts;
1028
+
1029
+ StringRef Source = R"(
1030
+ #if 123'124
1031
+ #endif
1032
+ )" ;
1033
+
1034
+ LangOpts.CPlusPlus14 = true ;
1035
+ ASSERT_FALSE (minimizeSourceToDependencyDirectives (Source, Out, Tokens,
1036
+ Directives, LangOpts));
1037
+ EXPECT_STREQ (" #if 123'124\n #endif\n " , Out.data ());
1038
+ ASSERT_EQ (Directives.size (), 3u );
1039
+ EXPECT_EQ (Directives[0 ].Kind , dependency_directives_scan::pp_if);
1040
+ EXPECT_EQ (Directives[1 ].Kind , dependency_directives_scan::pp_endif);
1041
+ EXPECT_EQ (Directives[2 ].Kind , dependency_directives_scan::pp_eof);
1042
+ ASSERT_EQ (Tokens.size (), 7u );
1043
+
1044
+ ASSERT_TRUE (Tokens[0 ].is (tok::hash));
1045
+ ASSERT_TRUE (Tokens[1 ].is (tok::raw_identifier)); // "if"
1046
+ ASSERT_TRUE (Tokens[2 ].is (tok::numeric_constant)); // 123'124
1047
+ ASSERT_TRUE (Tokens[3 ].is (tok::eod));
1048
+ ASSERT_TRUE (Tokens[4 ].is (tok::hash));
1049
+ ASSERT_TRUE (Tokens[5 ].is (tok::raw_identifier)); // #endif
1050
+ ASSERT_TRUE (Tokens[6 ].is (tok::eod));
1051
+
1052
+ LangOpts.CPlusPlus14 = false ;
1053
+ ASSERT_FALSE (minimizeSourceToDependencyDirectives (Source, Out, Tokens,
1054
+ Directives, LangOpts));
1055
+ EXPECT_STREQ (" #if 123'124\n #endif\n " , Out.data ());
1056
+ ASSERT_EQ (Directives.size (), 3u );
1057
+ EXPECT_EQ (Directives[0 ].Kind , dependency_directives_scan::pp_if);
1058
+ EXPECT_EQ (Directives[1 ].Kind , dependency_directives_scan::pp_endif);
1059
+ EXPECT_EQ (Directives[2 ].Kind , dependency_directives_scan::pp_eof);
1060
+ ASSERT_EQ (Tokens.size (), 8u );
1061
+ ASSERT_TRUE (Tokens[0 ].is (tok::hash));
1062
+ ASSERT_TRUE (Tokens[1 ].is (tok::raw_identifier)); // "if"
1063
+ ASSERT_TRUE (Tokens[2 ].is (tok::numeric_constant)); // 123
1064
+ ASSERT_TRUE (Tokens[3 ].is (tok::unknown)); // '124
1065
+ ASSERT_TRUE (Tokens[4 ].is (tok::eod));
1066
+ ASSERT_TRUE (Tokens[5 ].is (tok::hash));
1067
+ ASSERT_TRUE (Tokens[6 ].is (tok::raw_identifier)); // #endif
1068
+ ASSERT_TRUE (Tokens[7 ].is (tok::eod));
1069
+ }
1070
+
1015
1071
} // end anonymous namespace
0 commit comments