xref: /llvm-project/llvm/unittests/FileCheck/FileCheckTest.cpp (revision 13eb298d5c3c31550fee0c889d3fd3a265450e3d)
1 //===- llvm/unittest/FileCheck/FileCheckTest.cpp - FileCheck tests --------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "llvm/FileCheck/FileCheck.h"
10 #include "../lib/FileCheck/FileCheckImpl.h"
11 #include "llvm/Support/Regex.h"
12 #include "llvm/Testing/Support/Error.h"
13 #include "gtest/gtest.h"
14 #include <tuple>
15 #include <unordered_set>
16 
17 using namespace llvm;
18 
19 namespace {
20 
21 class FileCheckTest : public ::testing::Test {};
22 
23 static StringRef bufferize(SourceMgr &SM, StringRef Str) {
24   std::unique_ptr<MemoryBuffer> Buffer =
25       MemoryBuffer::getMemBufferCopy(Str, "TestBuffer");
26   StringRef StrBufferRef = Buffer->getBuffer();
27   SM.AddNewSourceBuffer(std::move(Buffer), SMLoc());
28   return StrBufferRef;
29 }
30 
31 static std::string toString(const std::unordered_set<std::string> &Set) {
32   bool First = true;
33   std::string Str;
34   for (StringRef S : Set) {
35     Str += Twine(First ? "{" + S : ", " + S).str();
36     First = false;
37   }
38   Str += '}';
39   return Str;
40 }
41 
42 template <typename ErrorT>
43 static void expectSameErrors(std::unordered_set<std::string> ExpectedMsgs,
44                              Error Err) {
45   auto AnyErrorMsgMatch = [&ExpectedMsgs](std::string &&ErrorMsg) -> bool {
46     for (auto ExpectedMsgItr = ExpectedMsgs.begin(),
47               ExpectedMsgEnd = ExpectedMsgs.end();
48          ExpectedMsgItr != ExpectedMsgEnd; ++ExpectedMsgItr) {
49       if (ErrorMsg.find(*ExpectedMsgItr) != std::string::npos) {
50         ExpectedMsgs.erase(ExpectedMsgItr);
51         return true;
52       }
53     }
54     return false;
55   };
56 
57   Error RemainingErrors = std::move(Err);
58   do {
59     RemainingErrors =
60         handleErrors(std::move(RemainingErrors), [&](const ErrorT &E) {
61           EXPECT_TRUE(AnyErrorMsgMatch(E.message()))
62               << "Unexpected error message:" << std::endl
63               << E.message();
64         });
65   } while (RemainingErrors && !ExpectedMsgs.empty());
66   EXPECT_THAT_ERROR(std::move(RemainingErrors), Succeeded());
67   EXPECT_TRUE(ExpectedMsgs.empty())
68       << "Error message(s) not found:" << std::endl
69       << toString(ExpectedMsgs);
70 }
71 
72 template <typename ErrorT>
73 static void expectError(StringRef ExpectedMsg, Error Err) {
74   expectSameErrors<ErrorT>({ExpectedMsg.str()}, std::move(Err));
75 }
76 
77 static void expectDiagnosticError(StringRef ExpectedMsg, Error Err) {
78   expectError<ErrorDiagnostic>(ExpectedMsg, std::move(Err));
79 }
80 
81 constexpr uint64_t MaxUint64 = std::numeric_limits<uint64_t>::max();
82 constexpr int64_t MaxInt64 = std::numeric_limits<int64_t>::max();
83 constexpr int64_t MinInt64 = std::numeric_limits<int64_t>::min();
84 constexpr uint64_t AbsoluteMinInt64 =
85     static_cast<uint64_t>(-(MinInt64 + 1)) + 1;
86 constexpr uint64_t AbsoluteMaxInt64 = static_cast<uint64_t>(MaxInt64);
87 
88 struct ExpressionFormatParameterisedFixture
89     : public ::testing::TestWithParam<
90           std::tuple<ExpressionFormat::Kind, unsigned, bool>> {
91   bool AlternateForm;
92   unsigned Precision;
93   bool Signed;
94   bool AllowHex;
95   bool AllowUpperHex;
96   ExpressionFormat Format;
97   Regex WildcardRegex;
98 
99   StringRef TenStr;
100   StringRef FifteenStr;
101   std::string MaxUint64Str;
102   std::string MaxInt64Str;
103   std::string MinInt64Str;
104   StringRef FirstInvalidCharDigits;
105   StringRef AcceptedHexOnlyDigits;
106   StringRef RefusedHexOnlyDigits;
107 
108   SourceMgr SM;
109 
110   void SetUp() override {
111     ExpressionFormat::Kind Kind;
112     std::tie(Kind, Precision, AlternateForm) = GetParam();
113     AllowHex = Kind == ExpressionFormat::Kind::HexLower ||
114                Kind == ExpressionFormat::Kind::HexUpper;
115     AllowUpperHex = Kind == ExpressionFormat::Kind::HexUpper;
116     Signed = Kind == ExpressionFormat::Kind::Signed;
117     Format = ExpressionFormat(Kind, Precision, AlternateForm);
118 
119     if (!AllowHex) {
120       MaxUint64Str = std::to_string(MaxUint64);
121       MaxInt64Str = std::to_string(MaxInt64);
122       MinInt64Str = std::to_string(MinInt64);
123       TenStr = "10";
124       FifteenStr = "15";
125       FirstInvalidCharDigits = "aA";
126       AcceptedHexOnlyDigits = RefusedHexOnlyDigits = "N/A";
127       return;
128     }
129 
130     MaxUint64Str = AllowUpperHex ? "FFFFFFFFFFFFFFFF" : "ffffffffffffffff";
131     MaxInt64Str = AllowUpperHex ? "7FFFFFFFFFFFFFFF" : "7fffffffffffffff";
132     TenStr = AllowUpperHex ? "A" : "a";
133     FifteenStr = AllowUpperHex ? "F" : "f";
134     AcceptedHexOnlyDigits = AllowUpperHex ? "ABCDEF" : "abcdef";
135     RefusedHexOnlyDigits = AllowUpperHex ? "abcdef" : "ABCDEF";
136     MinInt64Str = "N/A";
137     FirstInvalidCharDigits = "gG";
138   }
139 
140   void checkWildcardRegexMatch(StringRef Input,
141                                unsigned TrailExtendTo = 0) const {
142     ASSERT_TRUE(TrailExtendTo == 0 || AllowHex);
143     SmallVector<StringRef, 4> Matches;
144     std::string ExtendedInput = Input.str();
145     size_t PrefixSize = AlternateForm ? 2 : 0;
146     if (TrailExtendTo > Input.size() - PrefixSize) {
147       size_t ExtensionSize = PrefixSize + TrailExtendTo - Input.size();
148       ExtendedInput.append(ExtensionSize, Input[PrefixSize]);
149     }
150     ASSERT_TRUE(WildcardRegex.match(ExtendedInput, &Matches))
151         << "Wildcard regex does not match " << ExtendedInput;
152     EXPECT_EQ(Matches[0], ExtendedInput);
153   }
154 
155   void checkWildcardRegexMatchFailure(StringRef Input) const {
156     EXPECT_FALSE(WildcardRegex.match(Input));
157   }
158 
159   std::string addBasePrefix(StringRef Num) const {
160     StringRef Prefix = AlternateForm ? "0x" : "";
161     return (Twine(Prefix) + Twine(Num)).str();
162   }
163 
164   void checkPerCharWildcardRegexMatchFailure(StringRef Chars) const {
165     for (auto C : Chars) {
166       std::string Str = addBasePrefix(StringRef(&C, 1));
167       EXPECT_FALSE(WildcardRegex.match(Str));
168     }
169   }
170 
171   std::string padWithLeadingZeros(StringRef NumStr) const {
172     bool Negative = NumStr.startswith("-");
173     if (NumStr.size() - unsigned(Negative) >= Precision)
174       return NumStr.str();
175 
176     std::string PaddedStr;
177     if (Negative) {
178       PaddedStr = "-";
179       NumStr = NumStr.drop_front();
180     }
181     PaddedStr.append(Precision - NumStr.size(), '0');
182     PaddedStr.append(NumStr.str());
183     return PaddedStr;
184   }
185 
186   template <class T> void checkMatchingString(T Val, StringRef ExpectedStr) {
187     Expected<std::string> MatchingString =
188         Format.getMatchingString(ExpressionValue(Val));
189     ASSERT_THAT_EXPECTED(MatchingString, Succeeded())
190         << "No matching string for " << Val;
191     EXPECT_EQ(*MatchingString, ExpectedStr);
192   }
193 
194   template <class T> void checkMatchingStringFailure(T Val) {
195     Expected<std::string> MatchingString =
196         Format.getMatchingString(ExpressionValue(Val));
197     // Error message tested in ExpressionValue unit tests.
198     EXPECT_THAT_EXPECTED(MatchingString, Failed());
199   }
200 
201   Expected<ExpressionValue> getValueFromStringReprFailure(StringRef Str) {
202     StringRef BufferizedStr = bufferize(SM, Str);
203     return Format.valueFromStringRepr(BufferizedStr, SM);
204   }
205 
206   template <class T>
207   void checkValueFromStringRepr(StringRef Str, T ExpectedVal) {
208     Expected<ExpressionValue> ResultValue = getValueFromStringReprFailure(Str);
209     ASSERT_THAT_EXPECTED(ResultValue, Succeeded())
210         << "Failed to get value from " << Str;
211     ASSERT_EQ(ResultValue->isNegative(), ExpectedVal < 0)
212         << "Value for " << Str << " is not " << ExpectedVal;
213     if (ResultValue->isNegative())
214       EXPECT_EQ(cantFail(ResultValue->getSignedValue()),
215                 static_cast<int64_t>(ExpectedVal));
216     else
217       EXPECT_EQ(cantFail(ResultValue->getUnsignedValue()),
218                 static_cast<uint64_t>(ExpectedVal));
219   }
220 
221   void checkValueFromStringReprFailure(
222       StringRef Str, StringRef ErrorStr = "unable to represent numeric value") {
223     Expected<ExpressionValue> ResultValue = getValueFromStringReprFailure(Str);
224     expectDiagnosticError(ErrorStr, ResultValue.takeError());
225   }
226 };
227 
228 TEST_P(ExpressionFormatParameterisedFixture, FormatGetWildcardRegex) {
229   // Wildcard regex is valid.
230   Expected<std::string> WildcardPattern = Format.getWildcardRegex();
231   ASSERT_THAT_EXPECTED(WildcardPattern, Succeeded());
232   WildcardRegex = Regex((Twine("^") + *WildcardPattern + "$").str());
233   ASSERT_TRUE(WildcardRegex.isValid());
234 
235   // Does not match empty string.
236   checkWildcardRegexMatchFailure("");
237 
238   // Matches all decimal digits, matches several of them and match 0x prefix
239   // if and only if AlternateForm is true.
240   StringRef LongNumber = "12345678901234567890";
241   StringRef PrefixedLongNumber = "0x12345678901234567890";
242   if (AlternateForm) {
243     checkWildcardRegexMatch(PrefixedLongNumber);
244     checkWildcardRegexMatchFailure(LongNumber);
245   } else {
246     checkWildcardRegexMatch(LongNumber);
247     checkWildcardRegexMatchFailure(PrefixedLongNumber);
248   }
249 
250   // Matches negative digits.
251   LongNumber = "-12345678901234567890";
252   if (Signed)
253     checkWildcardRegexMatch(LongNumber);
254   else
255     checkWildcardRegexMatchFailure(LongNumber);
256 
257   // Check non digits or digits with wrong casing are not matched.
258   std::string LongNumberStr;
259   if (AllowHex) {
260     LongNumberStr = addBasePrefix(AcceptedHexOnlyDigits);
261     checkWildcardRegexMatch(LongNumberStr, 16);
262     checkPerCharWildcardRegexMatchFailure(RefusedHexOnlyDigits);
263   }
264   checkPerCharWildcardRegexMatchFailure(FirstInvalidCharDigits);
265 
266   // Check leading zeros are only accepted if number of digits is less than the
267   // precision.
268   LongNumber = "01234567890123456789";
269   if (Precision) {
270     LongNumberStr = addBasePrefix(LongNumber.take_front(Precision));
271     checkWildcardRegexMatch(LongNumberStr);
272     LongNumberStr = addBasePrefix(LongNumber.take_front(Precision - 1));
273     checkWildcardRegexMatchFailure(LongNumberStr);
274     if (Precision < LongNumber.size()) {
275       LongNumberStr = addBasePrefix(LongNumber.take_front(Precision + 1));
276       checkWildcardRegexMatchFailure(LongNumberStr);
277     }
278   } else {
279     LongNumberStr = addBasePrefix(LongNumber);
280     checkWildcardRegexMatch(LongNumberStr);
281   }
282 }
283 
284 TEST_P(ExpressionFormatParameterisedFixture, FormatGetMatchingString) {
285   checkMatchingString(0, addBasePrefix(padWithLeadingZeros("0")));
286   checkMatchingString(9, addBasePrefix(padWithLeadingZeros("9")));
287 
288   if (Signed) {
289     checkMatchingString(-5, padWithLeadingZeros("-5"));
290     checkMatchingStringFailure(MaxUint64);
291     checkMatchingString(MaxInt64, padWithLeadingZeros(MaxInt64Str));
292     checkMatchingString(MinInt64, padWithLeadingZeros(MinInt64Str));
293   } else {
294     checkMatchingStringFailure(-5);
295     checkMatchingString(MaxUint64,
296                         addBasePrefix(padWithLeadingZeros(MaxUint64Str)));
297     checkMatchingString(MaxInt64,
298                         addBasePrefix(padWithLeadingZeros(MaxInt64Str)));
299     checkMatchingStringFailure(MinInt64);
300   }
301 
302   checkMatchingString(10, addBasePrefix(padWithLeadingZeros(TenStr)));
303   checkMatchingString(15, addBasePrefix(padWithLeadingZeros(FifteenStr)));
304 }
305 
306 TEST_P(ExpressionFormatParameterisedFixture, FormatValueFromStringRepr) {
307   checkValueFromStringRepr(addBasePrefix("0"), 0);
308   checkValueFromStringRepr(addBasePrefix("9"), 9);
309 
310   if (Signed) {
311     checkValueFromStringRepr("-5", -5);
312     checkValueFromStringReprFailure(MaxUint64Str);
313   } else {
314     checkValueFromStringRepr(addBasePrefix(MaxUint64Str), MaxUint64);
315   }
316 
317   checkValueFromStringRepr(addBasePrefix(TenStr), 10);
318   checkValueFromStringRepr(addBasePrefix(FifteenStr), 15);
319 
320   // Wrong casing is not tested because valueFromStringRepr() relies on
321   // StringRef's getAsInteger() which does not allow to restrict casing.
322   checkValueFromStringReprFailure(addBasePrefix("G"));
323 }
324 
325 TEST_P(ExpressionFormatParameterisedFixture, FormatBoolOperator) {
326   EXPECT_TRUE(bool(Format));
327 }
328 
329 INSTANTIATE_TEST_SUITE_P(
330     AllowedExplicitExpressionFormat, ExpressionFormatParameterisedFixture,
331     ::testing::Values(
332         std::make_tuple(ExpressionFormat::Kind::Unsigned, 0, false),
333         std::make_tuple(ExpressionFormat::Kind::Signed, 0, false),
334         std::make_tuple(ExpressionFormat::Kind::HexLower, 0, false),
335         std::make_tuple(ExpressionFormat::Kind::HexLower, 0, true),
336         std::make_tuple(ExpressionFormat::Kind::HexUpper, 0, false),
337         std::make_tuple(ExpressionFormat::Kind::HexUpper, 0, true),
338 
339         std::make_tuple(ExpressionFormat::Kind::Unsigned, 1, false),
340         std::make_tuple(ExpressionFormat::Kind::Signed, 1, false),
341         std::make_tuple(ExpressionFormat::Kind::HexLower, 1, false),
342         std::make_tuple(ExpressionFormat::Kind::HexLower, 1, true),
343         std::make_tuple(ExpressionFormat::Kind::HexUpper, 1, false),
344         std::make_tuple(ExpressionFormat::Kind::HexUpper, 1, true),
345 
346         std::make_tuple(ExpressionFormat::Kind::Unsigned, 16, false),
347         std::make_tuple(ExpressionFormat::Kind::Signed, 16, false),
348         std::make_tuple(ExpressionFormat::Kind::HexLower, 16, false),
349         std::make_tuple(ExpressionFormat::Kind::HexLower, 16, true),
350         std::make_tuple(ExpressionFormat::Kind::HexUpper, 16, false),
351         std::make_tuple(ExpressionFormat::Kind::HexUpper, 16, true),
352 
353         std::make_tuple(ExpressionFormat::Kind::Unsigned, 20, false),
354         std::make_tuple(ExpressionFormat::Kind::Signed, 20, false)));
355 
356 TEST_F(FileCheckTest, NoFormatProperties) {
357   ExpressionFormat NoFormat(ExpressionFormat::Kind::NoFormat);
358   expectError<StringError>("trying to match value with invalid format",
359                            NoFormat.getWildcardRegex().takeError());
360   expectError<StringError>(
361       "trying to match value with invalid format",
362       NoFormat.getMatchingString(ExpressionValue(18u)).takeError());
363   EXPECT_FALSE(bool(NoFormat));
364 }
365 
366 TEST_F(FileCheckTest, FormatEqualityOperators) {
367   ExpressionFormat UnsignedFormat(ExpressionFormat::Kind::Unsigned);
368   ExpressionFormat UnsignedFormat2(ExpressionFormat::Kind::Unsigned);
369   EXPECT_TRUE(UnsignedFormat == UnsignedFormat2);
370   EXPECT_FALSE(UnsignedFormat != UnsignedFormat2);
371 
372   ExpressionFormat HexLowerFormat(ExpressionFormat::Kind::HexLower);
373   EXPECT_FALSE(UnsignedFormat == HexLowerFormat);
374   EXPECT_TRUE(UnsignedFormat != HexLowerFormat);
375 
376   ExpressionFormat NoFormat(ExpressionFormat::Kind::NoFormat);
377   ExpressionFormat NoFormat2(ExpressionFormat::Kind::NoFormat);
378   EXPECT_FALSE(NoFormat == NoFormat2);
379   EXPECT_TRUE(NoFormat != NoFormat2);
380 }
381 
382 TEST_F(FileCheckTest, FormatKindEqualityOperators) {
383   ExpressionFormat UnsignedFormat(ExpressionFormat::Kind::Unsigned);
384   EXPECT_TRUE(UnsignedFormat == ExpressionFormat::Kind::Unsigned);
385   EXPECT_FALSE(UnsignedFormat != ExpressionFormat::Kind::Unsigned);
386   EXPECT_FALSE(UnsignedFormat == ExpressionFormat::Kind::HexLower);
387   EXPECT_TRUE(UnsignedFormat != ExpressionFormat::Kind::HexLower);
388   ExpressionFormat NoFormat(ExpressionFormat::Kind::NoFormat);
389   EXPECT_TRUE(NoFormat == ExpressionFormat::Kind::NoFormat);
390   EXPECT_FALSE(NoFormat != ExpressionFormat::Kind::NoFormat);
391 }
392 
393 template <class T1, class T2>
394 static Expected<ExpressionValue> doValueOperation(binop_eval_t Operation,
395                                                   T1 LeftValue, T2 RightValue) {
396   ExpressionValue LeftOperand(LeftValue);
397   ExpressionValue RightOperand(RightValue);
398   return Operation(LeftOperand, RightOperand);
399 }
400 
401 template <class T>
402 static void expectValueEqual(ExpressionValue ActualValue, T ExpectedValue) {
403   EXPECT_EQ(ExpectedValue < 0, ActualValue.isNegative());
404   if (ExpectedValue < 0) {
405     Expected<int64_t> SignedActualValue = ActualValue.getSignedValue();
406     ASSERT_THAT_EXPECTED(SignedActualValue, Succeeded());
407     EXPECT_EQ(*SignedActualValue, static_cast<int64_t>(ExpectedValue));
408   } else {
409     Expected<uint64_t> UnsignedActualValue = ActualValue.getUnsignedValue();
410     ASSERT_THAT_EXPECTED(UnsignedActualValue, Succeeded());
411     EXPECT_EQ(*UnsignedActualValue, static_cast<uint64_t>(ExpectedValue));
412   }
413 }
414 
415 template <class T1, class T2, class TR>
416 static void expectOperationValueResult(binop_eval_t Operation, T1 LeftValue,
417                                        T2 RightValue, TR ResultValue) {
418   Expected<ExpressionValue> OperationResult =
419       doValueOperation(Operation, LeftValue, RightValue);
420   ASSERT_THAT_EXPECTED(OperationResult, Succeeded());
421   expectValueEqual(*OperationResult, ResultValue);
422 }
423 
424 template <class T1, class T2>
425 static void expectOperationValueResult(binop_eval_t Operation, T1 LeftValue,
426                                        T2 RightValue) {
427   expectError<OverflowError>(
428       "overflow error",
429       doValueOperation(Operation, LeftValue, RightValue).takeError());
430 }
431 
432 TEST_F(FileCheckTest, ExpressionValueGetUnsigned) {
433   // Test positive value.
434   Expected<uint64_t> UnsignedValue = ExpressionValue(10).getUnsignedValue();
435   ASSERT_THAT_EXPECTED(UnsignedValue, Succeeded());
436   EXPECT_EQ(*UnsignedValue, 10U);
437 
438   // Test 0.
439   UnsignedValue = ExpressionValue(0).getUnsignedValue();
440   ASSERT_THAT_EXPECTED(UnsignedValue, Succeeded());
441   EXPECT_EQ(*UnsignedValue, 0U);
442 
443   // Test max positive value.
444   UnsignedValue = ExpressionValue(MaxUint64).getUnsignedValue();
445   ASSERT_THAT_EXPECTED(UnsignedValue, Succeeded());
446   EXPECT_EQ(*UnsignedValue, MaxUint64);
447 
448   // Test failure with negative value.
449   expectError<OverflowError>(
450       "overflow error", ExpressionValue(-1).getUnsignedValue().takeError());
451 
452   // Test failure with min negative value.
453   expectError<OverflowError>(
454       "overflow error",
455       ExpressionValue(MinInt64).getUnsignedValue().takeError());
456 }
457 
458 TEST_F(FileCheckTest, ExpressionValueGetSigned) {
459   // Test positive value.
460   Expected<int64_t> SignedValue = ExpressionValue(10).getSignedValue();
461   ASSERT_THAT_EXPECTED(SignedValue, Succeeded());
462   EXPECT_EQ(*SignedValue, 10);
463 
464   // Test 0.
465   SignedValue = ExpressionValue(0).getSignedValue();
466   ASSERT_THAT_EXPECTED(SignedValue, Succeeded());
467   EXPECT_EQ(*SignedValue, 0);
468 
469   // Test max int64_t.
470   SignedValue = ExpressionValue(MaxInt64).getSignedValue();
471   ASSERT_THAT_EXPECTED(SignedValue, Succeeded());
472   EXPECT_EQ(*SignedValue, MaxInt64);
473 
474   // Test failure with too big positive value.
475   expectError<OverflowError>(
476       "overflow error", ExpressionValue(static_cast<uint64_t>(MaxInt64) + 1)
477                             .getSignedValue()
478                             .takeError());
479 
480   // Test failure with max uint64_t.
481   expectError<OverflowError>(
482       "overflow error",
483       ExpressionValue(MaxUint64).getSignedValue().takeError());
484 
485   // Test negative value.
486   SignedValue = ExpressionValue(-10).getSignedValue();
487   ASSERT_THAT_EXPECTED(SignedValue, Succeeded());
488   EXPECT_EQ(*SignedValue, -10);
489 
490   // Test min int64_t.
491   SignedValue = ExpressionValue(MinInt64).getSignedValue();
492   ASSERT_THAT_EXPECTED(SignedValue, Succeeded());
493   EXPECT_EQ(*SignedValue, MinInt64);
494 }
495 
496 TEST_F(FileCheckTest, ExpressionValueAbsolute) {
497   // Test positive value.
498   expectValueEqual(ExpressionValue(10).getAbsolute(), 10);
499 
500   // Test 0.
501   expectValueEqual(ExpressionValue(0).getAbsolute(), 0);
502 
503   // Test max uint64_t.
504   expectValueEqual(ExpressionValue(MaxUint64).getAbsolute(), MaxUint64);
505 
506   // Test negative value.
507   expectValueEqual(ExpressionValue(-10).getAbsolute(), 10);
508 
509   // Test absence of overflow on min int64_t.
510   expectValueEqual(ExpressionValue(MinInt64).getAbsolute(),
511                    static_cast<uint64_t>(-(MinInt64 + 10)) + 10);
512 }
513 
514 TEST_F(FileCheckTest, ExpressionValueAddition) {
515   // Test both negative values.
516   expectOperationValueResult(operator+, -10, -10, -20);
517 
518   // Test both negative values with underflow.
519   expectOperationValueResult(operator+, MinInt64, -1);
520   expectOperationValueResult(operator+, MinInt64, MinInt64);
521 
522   // Test negative and positive value.
523   expectOperationValueResult(operator+, -10, 10, 0);
524   expectOperationValueResult(operator+, -10, 11, 1);
525   expectOperationValueResult(operator+, -11, 10, -1);
526 
527   // Test positive and negative value.
528   expectOperationValueResult(operator+, 10, -10, 0);
529   expectOperationValueResult(operator+, 10, -11, -1);
530   expectOperationValueResult(operator+, 11, -10, 1);
531 
532   // Test both positive values.
533   expectOperationValueResult(operator+, 10, 10, 20);
534 
535   // Test both positive values with overflow.
536   expectOperationValueResult(operator+, MaxUint64, 1);
537   expectOperationValueResult(operator+, MaxUint64, MaxUint64);
538 }
539 
540 TEST_F(FileCheckTest, ExpressionValueSubtraction) {
541   // Test negative value and value bigger than int64_t max.
542   expectOperationValueResult(operator-, -10, MaxUint64);
543 
544   // Test negative and positive value with underflow.
545   expectOperationValueResult(operator-, MinInt64, 1);
546 
547   // Test negative and positive value.
548   expectOperationValueResult(operator-, -10, 10, -20);
549 
550   // Test both negative values.
551   expectOperationValueResult(operator-, -10, -10, 0);
552   expectOperationValueResult(operator-, -11, -10, -1);
553   expectOperationValueResult(operator-, -10, -11, 1);
554 
555   // Test positive and negative values.
556   expectOperationValueResult(operator-, 10, -10, 20);
557 
558   // Test both positive values with result positive.
559   expectOperationValueResult(operator-, 10, 5, 5);
560 
561   // Test both positive values with underflow.
562   expectOperationValueResult(operator-, 0, MaxUint64);
563   expectOperationValueResult(operator-, 0,
564                              static_cast<uint64_t>(-(MinInt64 + 10)) + 11);
565 
566   // Test both positive values with result < -(max int64_t)
567   expectOperationValueResult(operator-, 10,
568                              static_cast<uint64_t>(MaxInt64) + 11,
569                              -MaxInt64 - 1);
570 
571   // Test both positive values with 0 > result > -(max int64_t)
572   expectOperationValueResult(operator-, 10, 11, -1);
573 }
574 
575 TEST_F(FileCheckTest, ExpressionValueMultiplication) {
576   // Test mixed signed values.
577   expectOperationValueResult(operator*, -3, 10, -30);
578   expectOperationValueResult(operator*, 2, -17, -34);
579   expectOperationValueResult(operator*, 0, MinInt64, 0);
580   expectOperationValueResult(operator*, MinInt64, 1, MinInt64);
581   expectOperationValueResult(operator*, 1, MinInt64, MinInt64);
582   expectOperationValueResult(operator*, MaxInt64, -1, -MaxInt64);
583   expectOperationValueResult(operator*, -1, MaxInt64, -MaxInt64);
584 
585   // Test both negative values.
586   expectOperationValueResult(operator*, -3, -10, 30);
587   expectOperationValueResult(operator*, -2, -17, 34);
588   expectOperationValueResult(operator*, MinInt64, -1, AbsoluteMinInt64);
589 
590   // Test both positive values.
591   expectOperationValueResult(operator*, 3, 10, 30);
592   expectOperationValueResult(operator*, 2, 17, 34);
593   expectOperationValueResult(operator*, 0, MaxUint64, 0);
594 
595   // Test negative results that underflow.
596   expectOperationValueResult(operator*, -10, MaxInt64);
597   expectOperationValueResult(operator*, MaxInt64, -10);
598   expectOperationValueResult(operator*, 10, MinInt64);
599   expectOperationValueResult(operator*, MinInt64, 10);
600   expectOperationValueResult(operator*, -1, MaxUint64);
601   expectOperationValueResult(operator*, MaxUint64, -1);
602   expectOperationValueResult(operator*, -1, AbsoluteMaxInt64 + 2);
603   expectOperationValueResult(operator*, AbsoluteMaxInt64 + 2, -1);
604 
605   // Test positive results that overflow.
606   expectOperationValueResult(operator*, 10, MaxUint64);
607   expectOperationValueResult(operator*, MaxUint64, 10);
608   expectOperationValueResult(operator*, MinInt64, -10);
609   expectOperationValueResult(operator*, -10, MinInt64);
610 }
611 
612 TEST_F(FileCheckTest, ExpressionValueDivision) {
613   // Test mixed signed values.
614   expectOperationValueResult(operator/, -30, 10, -3);
615   expectOperationValueResult(operator/, 34, -17, -2);
616   expectOperationValueResult(operator/, 0, -10, 0);
617   expectOperationValueResult(operator/, MinInt64, 1, MinInt64);
618   expectOperationValueResult(operator/, MaxInt64, -1, -MaxInt64);
619   expectOperationValueResult(operator/, -MaxInt64, 1, -MaxInt64);
620 
621   // Test both negative values.
622   expectOperationValueResult(operator/, -30, -10, 3);
623   expectOperationValueResult(operator/, -34, -17, 2);
624 
625   // Test both positive values.
626   expectOperationValueResult(operator/, 30, 10, 3);
627   expectOperationValueResult(operator/, 34, 17, 2);
628   expectOperationValueResult(operator/, 0, 10, 0);
629 
630   // Test divide by zero.
631   expectOperationValueResult(operator/, -10, 0);
632   expectOperationValueResult(operator/, 10, 0);
633   expectOperationValueResult(operator/, 0, 0);
634 
635   // Test negative result that underflows.
636   expectOperationValueResult(operator/, MaxUint64, -1);
637   expectOperationValueResult(operator/, AbsoluteMaxInt64 + 2, -1);
638 }
639 
640 TEST_F(FileCheckTest, ExpressionValueEquality) {
641   // Test negative and positive value.
642   EXPECT_FALSE(ExpressionValue(5) == ExpressionValue(-3));
643   EXPECT_TRUE(ExpressionValue(5) != ExpressionValue(-3));
644   EXPECT_FALSE(ExpressionValue(-2) == ExpressionValue(6));
645   EXPECT_TRUE(ExpressionValue(-2) != ExpressionValue(6));
646   EXPECT_FALSE(ExpressionValue(-7) == ExpressionValue(7));
647   EXPECT_TRUE(ExpressionValue(-7) != ExpressionValue(7));
648   EXPECT_FALSE(ExpressionValue(4) == ExpressionValue(-4));
649   EXPECT_TRUE(ExpressionValue(4) != ExpressionValue(-4));
650   EXPECT_FALSE(ExpressionValue(MaxUint64) == ExpressionValue(-1));
651   EXPECT_TRUE(ExpressionValue(MaxUint64) != ExpressionValue(-1));
652 
653   // Test both negative values.
654   EXPECT_FALSE(ExpressionValue(-2) == ExpressionValue(-7));
655   EXPECT_TRUE(ExpressionValue(-2) != ExpressionValue(-7));
656   EXPECT_TRUE(ExpressionValue(-3) == ExpressionValue(-3));
657   EXPECT_FALSE(ExpressionValue(-3) != ExpressionValue(-3));
658   EXPECT_FALSE(ExpressionValue(MinInt64) == ExpressionValue(-1));
659   EXPECT_TRUE(ExpressionValue(MinInt64) != ExpressionValue(-1));
660   EXPECT_FALSE(ExpressionValue(MinInt64) == ExpressionValue(-0));
661   EXPECT_TRUE(ExpressionValue(MinInt64) != ExpressionValue(-0));
662 
663   // Test both positive values.
664   EXPECT_FALSE(ExpressionValue(8) == ExpressionValue(9));
665   EXPECT_TRUE(ExpressionValue(8) != ExpressionValue(9));
666   EXPECT_TRUE(ExpressionValue(1) == ExpressionValue(1));
667   EXPECT_FALSE(ExpressionValue(1) != ExpressionValue(1));
668 
669   // Check the signedness of zero doesn't affect equality.
670   EXPECT_TRUE(ExpressionValue(0) == ExpressionValue(0));
671   EXPECT_FALSE(ExpressionValue(0) != ExpressionValue(0));
672   EXPECT_TRUE(ExpressionValue(0) == ExpressionValue(-0));
673   EXPECT_FALSE(ExpressionValue(0) != ExpressionValue(-0));
674   EXPECT_TRUE(ExpressionValue(-0) == ExpressionValue(0));
675   EXPECT_FALSE(ExpressionValue(-0) != ExpressionValue(0));
676   EXPECT_TRUE(ExpressionValue(-0) == ExpressionValue(-0));
677   EXPECT_FALSE(ExpressionValue(-0) != ExpressionValue(-0));
678 }
679 
680 TEST_F(FileCheckTest, Literal) {
681   SourceMgr SM;
682 
683   // Eval returns the literal's value.
684   ExpressionLiteral Ten(bufferize(SM, "10"), 10u);
685   Expected<ExpressionValue> Value = Ten.eval();
686   ASSERT_THAT_EXPECTED(Value, Succeeded());
687   EXPECT_EQ(10, cantFail(Value->getSignedValue()));
688   Expected<ExpressionFormat> ImplicitFormat = Ten.getImplicitFormat(SM);
689   ASSERT_THAT_EXPECTED(ImplicitFormat, Succeeded());
690   EXPECT_EQ(*ImplicitFormat, ExpressionFormat::Kind::NoFormat);
691 
692   // Min value can be correctly represented.
693   ExpressionLiteral Min(bufferize(SM, std::to_string(MinInt64)), MinInt64);
694   Value = Min.eval();
695   ASSERT_TRUE(bool(Value));
696   EXPECT_EQ(MinInt64, cantFail(Value->getSignedValue()));
697 
698   // Max value can be correctly represented.
699   ExpressionLiteral Max(bufferize(SM, std::to_string(MaxUint64)), MaxUint64);
700   Value = Max.eval();
701   ASSERT_THAT_EXPECTED(Value, Succeeded());
702   EXPECT_EQ(MaxUint64, cantFail(Value->getUnsignedValue()));
703 }
704 
705 TEST_F(FileCheckTest, Expression) {
706   SourceMgr SM;
707 
708   std::unique_ptr<ExpressionLiteral> Ten =
709       std::make_unique<ExpressionLiteral>(bufferize(SM, "10"), 10u);
710   ExpressionLiteral *TenPtr = Ten.get();
711   Expression Expr(std::move(Ten),
712                   ExpressionFormat(ExpressionFormat::Kind::HexLower));
713   EXPECT_EQ(Expr.getAST(), TenPtr);
714   EXPECT_EQ(Expr.getFormat(), ExpressionFormat::Kind::HexLower);
715 }
716 
717 static void
718 expectUndefErrors(std::unordered_set<std::string> ExpectedUndefVarNames,
719                   Error Err) {
720   EXPECT_THAT_ERROR(handleErrors(std::move(Err),
721                                  [&](const UndefVarError &E) {
722                                    EXPECT_EQ(ExpectedUndefVarNames.erase(
723                                                  std::string(E.getVarName())),
724                                              1U);
725                                  }),
726                     Succeeded());
727   EXPECT_TRUE(ExpectedUndefVarNames.empty()) << toString(ExpectedUndefVarNames);
728 }
729 
730 TEST_F(FileCheckTest, NumericVariable) {
731   SourceMgr SM;
732 
733   // Undefined variable: getValue and eval fail, error returned by eval holds
734   // the name of the undefined variable.
735   NumericVariable FooVar("FOO",
736                          ExpressionFormat(ExpressionFormat::Kind::Unsigned), 1);
737   EXPECT_EQ("FOO", FooVar.getName());
738   EXPECT_EQ(FooVar.getImplicitFormat(), ExpressionFormat::Kind::Unsigned);
739   NumericVariableUse FooVarUse("FOO", &FooVar);
740   Expected<ExpressionFormat> ImplicitFormat = FooVarUse.getImplicitFormat(SM);
741   ASSERT_THAT_EXPECTED(ImplicitFormat, Succeeded());
742   EXPECT_EQ(*ImplicitFormat, ExpressionFormat::Kind::Unsigned);
743   EXPECT_FALSE(FooVar.getValue());
744   Expected<ExpressionValue> EvalResult = FooVarUse.eval();
745   expectUndefErrors({"FOO"}, EvalResult.takeError());
746 
747   // Defined variable without string: only getValue and eval return value set.
748   FooVar.setValue(ExpressionValue(42u));
749   std::optional<ExpressionValue> Value = FooVar.getValue();
750   ASSERT_TRUE(Value);
751   EXPECT_EQ(42, cantFail(Value->getSignedValue()));
752   EXPECT_FALSE(FooVar.getStringValue());
753   EvalResult = FooVarUse.eval();
754   ASSERT_THAT_EXPECTED(EvalResult, Succeeded());
755   EXPECT_EQ(42, cantFail(EvalResult->getSignedValue()));
756 
757   // Defined variable with string: getValue, eval, and getStringValue return
758   // value set.
759   StringRef StringValue = "925";
760   FooVar.setValue(ExpressionValue(925u), StringValue);
761   Value = FooVar.getValue();
762   ASSERT_TRUE(Value);
763   EXPECT_EQ(925, cantFail(Value->getSignedValue()));
764   // getStringValue should return the same memory not just the same characters.
765   EXPECT_EQ(StringValue.begin(), FooVar.getStringValue()->begin());
766   EXPECT_EQ(StringValue.end(), FooVar.getStringValue()->end());
767   EvalResult = FooVarUse.eval();
768   ASSERT_THAT_EXPECTED(EvalResult, Succeeded());
769   EXPECT_EQ(925, cantFail(EvalResult->getSignedValue()));
770   EXPECT_EQ(925, cantFail(EvalResult->getSignedValue()));
771 
772   // Clearing variable: getValue and eval fail. Error returned by eval holds
773   // the name of the cleared variable.
774   FooVar.clearValue();
775   EXPECT_FALSE(FooVar.getValue());
776   EXPECT_FALSE(FooVar.getStringValue());
777   EvalResult = FooVarUse.eval();
778   expectUndefErrors({"FOO"}, EvalResult.takeError());
779 }
780 
781 TEST_F(FileCheckTest, Binop) {
782   SourceMgr SM;
783 
784   StringRef ExprStr = bufferize(SM, "FOO+BAR");
785   StringRef FooStr = ExprStr.take_front(3);
786   NumericVariable FooVar(FooStr,
787                          ExpressionFormat(ExpressionFormat::Kind::Unsigned), 1);
788   FooVar.setValue(ExpressionValue(42u));
789   std::unique_ptr<NumericVariableUse> FooVarUse =
790       std::make_unique<NumericVariableUse>(FooStr, &FooVar);
791   StringRef BarStr = ExprStr.take_back(3);
792   NumericVariable BarVar(BarStr,
793                          ExpressionFormat(ExpressionFormat::Kind::Unsigned), 2);
794   BarVar.setValue(ExpressionValue(18u));
795   std::unique_ptr<NumericVariableUse> BarVarUse =
796       std::make_unique<NumericVariableUse>(BarStr, &BarVar);
797   binop_eval_t doAdd = operator+;
798   BinaryOperation Binop(ExprStr, doAdd, std::move(FooVarUse),
799                         std::move(BarVarUse));
800 
801   // Defined variables: eval returns right value; implicit format is as
802   // expected.
803   Expected<ExpressionValue> Value = Binop.eval();
804   ASSERT_THAT_EXPECTED(Value, Succeeded());
805   EXPECT_EQ(60, cantFail(Value->getSignedValue()));
806   Expected<ExpressionFormat> ImplicitFormat = Binop.getImplicitFormat(SM);
807   ASSERT_THAT_EXPECTED(ImplicitFormat, Succeeded());
808   EXPECT_EQ(*ImplicitFormat, ExpressionFormat::Kind::Unsigned);
809 
810   // 1 undefined variable: eval fails, error contains name of undefined
811   // variable.
812   FooVar.clearValue();
813   Value = Binop.eval();
814   expectUndefErrors({"FOO"}, Value.takeError());
815 
816   // 2 undefined variables: eval fails, error contains names of all undefined
817   // variables.
818   BarVar.clearValue();
819   Value = Binop.eval();
820   expectUndefErrors({"FOO", "BAR"}, Value.takeError());
821 
822   // Literal + Variable has format of variable.
823   ExprStr = bufferize(SM, "FOO+18");
824   FooStr = ExprStr.take_front(3);
825   StringRef EighteenStr = ExprStr.take_back(2);
826   FooVarUse = std::make_unique<NumericVariableUse>(FooStr, &FooVar);
827   std::unique_ptr<ExpressionLiteral> Eighteen =
828       std::make_unique<ExpressionLiteral>(EighteenStr, 18u);
829   Binop = BinaryOperation(ExprStr, doAdd, std::move(FooVarUse),
830                           std::move(Eighteen));
831   ImplicitFormat = Binop.getImplicitFormat(SM);
832   ASSERT_THAT_EXPECTED(ImplicitFormat, Succeeded());
833   EXPECT_EQ(*ImplicitFormat, ExpressionFormat::Kind::Unsigned);
834   ExprStr = bufferize(SM, "18+FOO");
835   FooStr = ExprStr.take_back(3);
836   EighteenStr = ExprStr.take_front(2);
837   FooVarUse = std::make_unique<NumericVariableUse>(FooStr, &FooVar);
838   Eighteen = std::make_unique<ExpressionLiteral>(EighteenStr, 18u);
839   Binop = BinaryOperation(ExprStr, doAdd, std::move(Eighteen),
840                           std::move(FooVarUse));
841   ImplicitFormat = Binop.getImplicitFormat(SM);
842   ASSERT_THAT_EXPECTED(ImplicitFormat, Succeeded());
843   EXPECT_EQ(*ImplicitFormat, ExpressionFormat::Kind::Unsigned);
844 
845   // Variables with different implicit format conflict.
846   ExprStr = bufferize(SM, "FOO+BAZ");
847   FooStr = ExprStr.take_front(3);
848   StringRef BazStr = ExprStr.take_back(3);
849   NumericVariable BazVar(BazStr,
850                          ExpressionFormat(ExpressionFormat::Kind::HexLower), 3);
851   FooVarUse = std::make_unique<NumericVariableUse>(FooStr, &FooVar);
852   std::unique_ptr<NumericVariableUse> BazVarUse =
853       std::make_unique<NumericVariableUse>(BazStr, &BazVar);
854   Binop = BinaryOperation(ExprStr, doAdd, std::move(FooVarUse),
855                           std::move(BazVarUse));
856   ImplicitFormat = Binop.getImplicitFormat(SM);
857   expectDiagnosticError(
858       "implicit format conflict between 'FOO' (%u) and 'BAZ' (%x), "
859       "need an explicit format specifier",
860       ImplicitFormat.takeError());
861 
862   // All variable conflicts are reported.
863   ExprStr = bufferize(SM, "(FOO+BAZ)+(FOO+QUUX)");
864   StringRef Paren1ExprStr = ExprStr.substr(1, 7);
865   FooStr = Paren1ExprStr.take_front(3);
866   BazStr = Paren1ExprStr.take_back(3);
867   StringRef Paren2ExprStr = ExprStr.substr(ExprStr.rfind('(') + 1, 8);
868   StringRef FooStr2 = Paren2ExprStr.take_front(3);
869   StringRef QuuxStr = Paren2ExprStr.take_back(4);
870   FooVarUse = std::make_unique<NumericVariableUse>(FooStr, &FooVar);
871   BazVarUse = std::make_unique<NumericVariableUse>(BazStr, &BazVar);
872   std::unique_ptr<NumericVariableUse> FooVarUse2 =
873       std::make_unique<NumericVariableUse>(FooStr2, &FooVar);
874   NumericVariable QuuxVar(
875       QuuxStr, ExpressionFormat(ExpressionFormat::Kind::HexLower), 4);
876   std::unique_ptr<NumericVariableUse> QuuxVarUse =
877       std::make_unique<NumericVariableUse>(QuuxStr, &QuuxVar);
878   std::unique_ptr<BinaryOperation> Binop1 = std::make_unique<BinaryOperation>(
879       ExprStr.take_front(9), doAdd, std::move(FooVarUse), std::move(BazVarUse));
880   std::unique_ptr<BinaryOperation> Binop2 = std::make_unique<BinaryOperation>(
881       ExprStr.take_back(10), doAdd, std::move(FooVarUse2),
882       std::move(QuuxVarUse));
883   std::unique_ptr<BinaryOperation> OuterBinop =
884       std::make_unique<BinaryOperation>(ExprStr, doAdd, std::move(Binop1),
885                                         std::move(Binop2));
886   ImplicitFormat = OuterBinop->getImplicitFormat(SM);
887   expectSameErrors<ErrorDiagnostic>(
888       {("implicit format conflict between 'FOO' (%u) and 'BAZ' (%x), need an "
889        "explicit format specifier"),
890        ("implicit format conflict between 'FOO' (%u) and 'QUUX' (%x), need an "
891        "explicit format specifier")},
892       ImplicitFormat.takeError());
893 }
894 
895 TEST_F(FileCheckTest, ValidVarNameStart) {
896   EXPECT_TRUE(Pattern::isValidVarNameStart('a'));
897   EXPECT_TRUE(Pattern::isValidVarNameStart('G'));
898   EXPECT_TRUE(Pattern::isValidVarNameStart('_'));
899   EXPECT_FALSE(Pattern::isValidVarNameStart('2'));
900   EXPECT_FALSE(Pattern::isValidVarNameStart('$'));
901   EXPECT_FALSE(Pattern::isValidVarNameStart('@'));
902   EXPECT_FALSE(Pattern::isValidVarNameStart('+'));
903   EXPECT_FALSE(Pattern::isValidVarNameStart('-'));
904   EXPECT_FALSE(Pattern::isValidVarNameStart(':'));
905 }
906 
907 TEST_F(FileCheckTest, ParseVar) {
908   SourceMgr SM;
909   StringRef OrigVarName = bufferize(SM, "GoodVar42");
910   StringRef VarName = OrigVarName;
911   Expected<Pattern::VariableProperties> ParsedVarResult =
912       Pattern::parseVariable(VarName, SM);
913   ASSERT_THAT_EXPECTED(ParsedVarResult, Succeeded());
914   EXPECT_EQ(ParsedVarResult->Name, OrigVarName);
915   EXPECT_TRUE(VarName.empty());
916   EXPECT_FALSE(ParsedVarResult->IsPseudo);
917 
918   VarName = OrigVarName = bufferize(SM, "$GoodGlobalVar");
919   ParsedVarResult = Pattern::parseVariable(VarName, SM);
920   ASSERT_THAT_EXPECTED(ParsedVarResult, Succeeded());
921   EXPECT_EQ(ParsedVarResult->Name, OrigVarName);
922   EXPECT_TRUE(VarName.empty());
923   EXPECT_FALSE(ParsedVarResult->IsPseudo);
924 
925   VarName = OrigVarName = bufferize(SM, "@GoodPseudoVar");
926   ParsedVarResult = Pattern::parseVariable(VarName, SM);
927   ASSERT_THAT_EXPECTED(ParsedVarResult, Succeeded());
928   EXPECT_EQ(ParsedVarResult->Name, OrigVarName);
929   EXPECT_TRUE(VarName.empty());
930   EXPECT_TRUE(ParsedVarResult->IsPseudo);
931 
932   VarName = bufferize(SM, "42BadVar");
933   ParsedVarResult = Pattern::parseVariable(VarName, SM);
934   expectDiagnosticError("invalid variable name", ParsedVarResult.takeError());
935 
936   VarName = bufferize(SM, "$@");
937   ParsedVarResult = Pattern::parseVariable(VarName, SM);
938   expectDiagnosticError("invalid variable name", ParsedVarResult.takeError());
939 
940   VarName = OrigVarName = bufferize(SM, "B@dVar");
941   ParsedVarResult = Pattern::parseVariable(VarName, SM);
942   ASSERT_THAT_EXPECTED(ParsedVarResult, Succeeded());
943   EXPECT_EQ(VarName, OrigVarName.substr(1));
944   EXPECT_EQ(ParsedVarResult->Name, "B");
945   EXPECT_FALSE(ParsedVarResult->IsPseudo);
946 
947   VarName = OrigVarName = bufferize(SM, "B$dVar");
948   ParsedVarResult = Pattern::parseVariable(VarName, SM);
949   ASSERT_THAT_EXPECTED(ParsedVarResult, Succeeded());
950   EXPECT_EQ(VarName, OrigVarName.substr(1));
951   EXPECT_EQ(ParsedVarResult->Name, "B");
952   EXPECT_FALSE(ParsedVarResult->IsPseudo);
953 
954   VarName = bufferize(SM, "BadVar+");
955   ParsedVarResult = Pattern::parseVariable(VarName, SM);
956   ASSERT_THAT_EXPECTED(ParsedVarResult, Succeeded());
957   EXPECT_EQ(VarName, "+");
958   EXPECT_EQ(ParsedVarResult->Name, "BadVar");
959   EXPECT_FALSE(ParsedVarResult->IsPseudo);
960 
961   VarName = bufferize(SM, "BadVar-");
962   ParsedVarResult = Pattern::parseVariable(VarName, SM);
963   ASSERT_THAT_EXPECTED(ParsedVarResult, Succeeded());
964   EXPECT_EQ(VarName, "-");
965   EXPECT_EQ(ParsedVarResult->Name, "BadVar");
966   EXPECT_FALSE(ParsedVarResult->IsPseudo);
967 
968   VarName = bufferize(SM, "BadVar:");
969   ParsedVarResult = Pattern::parseVariable(VarName, SM);
970   ASSERT_THAT_EXPECTED(ParsedVarResult, Succeeded());
971   EXPECT_EQ(VarName, ":");
972   EXPECT_EQ(ParsedVarResult->Name, "BadVar");
973   EXPECT_FALSE(ParsedVarResult->IsPseudo);
974 }
975 
976 static void expectNotFoundError(Error Err) {
977   expectError<NotFoundError>("String not found in input", std::move(Err));
978 }
979 
980 class PatternTester {
981 private:
982   size_t LineNumber = 1;
983   SourceMgr SM;
984   FileCheckRequest Req;
985   FileCheckPatternContext Context;
986   Pattern P{Check::CheckPlain, &Context, LineNumber};
987 
988 public:
989   PatternTester() {
990     std::vector<StringRef> GlobalDefines = {"#FOO=42", "BAR=BAZ", "#add=7"};
991     // An ASSERT_FALSE would make more sense but cannot be used in a
992     // constructor.
993     EXPECT_THAT_ERROR(Context.defineCmdlineVariables(GlobalDefines, SM),
994                       Succeeded());
995     Context.createLineVariable();
996     // Call parsePattern to have @LINE defined.
997     P.parsePattern("N/A", "CHECK", SM, Req);
998     // parsePattern does not expect to be called twice for the same line and
999     // will set FixedStr and RegExStr incorrectly if it is. Therefore prepare
1000     // a pattern for a different line.
1001     initNextPattern();
1002   }
1003 
1004   void initNextPattern() {
1005     P = Pattern(Check::CheckPlain, &Context, ++LineNumber);
1006   }
1007 
1008   size_t getLineNumber() const { return LineNumber; }
1009 
1010   Expected<std::unique_ptr<Expression>>
1011   parseSubst(StringRef Expr, bool IsLegacyLineExpr = false) {
1012     StringRef ExprBufferRef = bufferize(SM, Expr);
1013     std::optional<NumericVariable *> DefinedNumericVariable;
1014     return P.parseNumericSubstitutionBlock(
1015         ExprBufferRef, DefinedNumericVariable, IsLegacyLineExpr, LineNumber,
1016         &Context, SM);
1017   }
1018 
1019   bool parsePattern(StringRef Pattern) {
1020     StringRef PatBufferRef = bufferize(SM, Pattern);
1021     return P.parsePattern(PatBufferRef, "CHECK", SM, Req);
1022   }
1023 
1024   Expected<size_t> match(StringRef Buffer) {
1025     StringRef BufferRef = bufferize(SM, Buffer);
1026     Pattern::MatchResult Res = P.match(BufferRef, SM);
1027     if (Res.TheError)
1028       return std::move(Res.TheError);
1029     return Res.TheMatch->Pos;
1030   }
1031 
1032   void printVariableDefs(FileCheckDiag::MatchType MatchTy,
1033                          std::vector<FileCheckDiag> &Diags) {
1034     P.printVariableDefs(SM, MatchTy, &Diags);
1035   }
1036 };
1037 
1038 TEST_F(FileCheckTest, ParseNumericSubstitutionBlock) {
1039   PatternTester Tester;
1040 
1041   // Variable definition.
1042 
1043   expectDiagnosticError("invalid variable name",
1044                         Tester.parseSubst("%VAR:").takeError());
1045 
1046   expectDiagnosticError("definition of pseudo numeric variable unsupported",
1047                         Tester.parseSubst("@LINE:").takeError());
1048 
1049   expectDiagnosticError("string variable with name 'BAR' already exists",
1050                         Tester.parseSubst("BAR:").takeError());
1051 
1052   expectDiagnosticError("unexpected characters after numeric variable name",
1053                         Tester.parseSubst("VAR GARBAGE:").takeError());
1054 
1055   // Change of format.
1056   expectDiagnosticError("format different from previous variable definition",
1057                         Tester.parseSubst("%X,FOO:").takeError());
1058 
1059   // Invalid format.
1060   expectDiagnosticError("invalid matching format specification in expression",
1061                         Tester.parseSubst("X,VAR1:").takeError());
1062   expectDiagnosticError("invalid format specifier in expression",
1063                         Tester.parseSubst("%F,VAR1:").takeError());
1064   expectDiagnosticError("invalid matching format specification in expression",
1065                         Tester.parseSubst("%X a,VAR1:").takeError());
1066 
1067   // Acceptable variable definition.
1068   EXPECT_THAT_EXPECTED(Tester.parseSubst("VAR1:"), Succeeded());
1069   EXPECT_THAT_EXPECTED(Tester.parseSubst("  VAR2:"), Succeeded());
1070   EXPECT_THAT_EXPECTED(Tester.parseSubst("VAR3  :"), Succeeded());
1071   EXPECT_THAT_EXPECTED(Tester.parseSubst("VAR3:  "), Succeeded());
1072 
1073   // Acceptable variable definition with format specifier. Use parsePattern for
1074   // variables whose definition needs to be visible for later checks.
1075   EXPECT_FALSE(Tester.parsePattern("[[#%u, VAR_UNSIGNED:]]"));
1076   EXPECT_FALSE(Tester.parsePattern("[[#%x, VAR_LOWER_HEX:]]"));
1077   EXPECT_THAT_EXPECTED(Tester.parseSubst("%X, VAR_UPPER_HEX:"), Succeeded());
1078 
1079   // Acceptable variable definition with precision specifier.
1080   EXPECT_FALSE(Tester.parsePattern("[[#%.8X, PADDED_ADDR:]]"));
1081   EXPECT_FALSE(Tester.parsePattern("[[#%.8, PADDED_NUM:]]"));
1082 
1083   // Acceptable variable definition in alternate form.
1084   EXPECT_THAT_EXPECTED(Tester.parseSubst("%#x, PREFIXED_ADDR:"), Succeeded());
1085   EXPECT_THAT_EXPECTED(Tester.parseSubst("%#X, PREFIXED_ADDR:"), Succeeded());
1086 
1087   // Acceptable variable definition in alternate form.
1088   expectDiagnosticError("alternate form only supported for hex values",
1089                         Tester.parseSubst("%#u, PREFIXED_UNSI:").takeError());
1090   expectDiagnosticError("alternate form only supported for hex values",
1091                         Tester.parseSubst("%#d, PREFIXED_UNSI:").takeError());
1092 
1093   // Acceptable variable definition from a numeric expression.
1094   EXPECT_THAT_EXPECTED(Tester.parseSubst("FOOBAR: FOO+1"), Succeeded());
1095 
1096   // Numeric expression. Switch to next line to make above valid definition
1097   // available in expressions.
1098   Tester.initNextPattern();
1099 
1100   // Invalid variable name.
1101   expectDiagnosticError("invalid matching constraint or operand format",
1102                         Tester.parseSubst("%VAR").takeError());
1103 
1104   expectDiagnosticError("invalid pseudo numeric variable '@FOO'",
1105                         Tester.parseSubst("@FOO").takeError());
1106 
1107   // parsePattern() is used here instead of parseSubst() for the variable to be
1108   // recorded in GlobalNumericVariableTable and thus appear defined to
1109   // parseNumericVariableUse(). Note that the same pattern object is used for
1110   // the parsePattern() and parseSubst() since no initNextPattern() is called,
1111   // thus appearing as being on the same line from the pattern's point of view.
1112   ASSERT_FALSE(Tester.parsePattern("[[#SAME_LINE_VAR:]]"));
1113   expectDiagnosticError("numeric variable 'SAME_LINE_VAR' defined earlier in "
1114                         "the same CHECK directive",
1115                         Tester.parseSubst("SAME_LINE_VAR").takeError());
1116 
1117   // Invalid use of variable defined on the same line from an expression not
1118   // using any variable defined on the same line.
1119   ASSERT_FALSE(Tester.parsePattern("[[#SAME_LINE_EXPR_VAR:@LINE+1]]"));
1120   expectDiagnosticError("numeric variable 'SAME_LINE_EXPR_VAR' defined earlier "
1121                         "in the same CHECK directive",
1122                         Tester.parseSubst("SAME_LINE_EXPR_VAR").takeError());
1123 
1124   // Valid use of undefined variable which creates the variable and record it
1125   // in GlobalNumericVariableTable.
1126   ASSERT_THAT_EXPECTED(Tester.parseSubst("UNDEF"), Succeeded());
1127   EXPECT_TRUE(Tester.parsePattern("[[UNDEF:.*]]"));
1128 
1129   // Invalid literal.
1130   expectDiagnosticError("unsupported operation 'U'",
1131                         Tester.parseSubst("42U").takeError());
1132 
1133   // Valid empty expression.
1134   EXPECT_THAT_EXPECTED(Tester.parseSubst(""), Succeeded());
1135 
1136   // Invalid equality matching constraint with empty expression.
1137   expectDiagnosticError("empty numeric expression should not have a constraint",
1138                         Tester.parseSubst("==").takeError());
1139 
1140   // Valid single operand expression.
1141   EXPECT_THAT_EXPECTED(Tester.parseSubst("FOO"), Succeeded());
1142   EXPECT_THAT_EXPECTED(Tester.parseSubst("18"), Succeeded());
1143   EXPECT_THAT_EXPECTED(Tester.parseSubst(std::to_string(MaxUint64)),
1144                        Succeeded());
1145   EXPECT_THAT_EXPECTED(Tester.parseSubst("0x12"), Succeeded());
1146   EXPECT_THAT_EXPECTED(Tester.parseSubst("-30"), Succeeded());
1147   EXPECT_THAT_EXPECTED(Tester.parseSubst(std::to_string(MinInt64)),
1148                        Succeeded());
1149 
1150   // Valid optional matching constraint.
1151   EXPECT_THAT_EXPECTED(Tester.parseSubst("==FOO"), Succeeded());
1152 
1153   // Invalid matching constraint.
1154   expectDiagnosticError("invalid matching constraint or operand format",
1155                         Tester.parseSubst("+=FOO").takeError());
1156 
1157   // Invalid format.
1158   expectDiagnosticError("invalid matching format specification in expression",
1159                         Tester.parseSubst("X,FOO:").takeError());
1160   expectDiagnosticError("invalid format specifier in expression",
1161                         Tester.parseSubst("%F,FOO").takeError());
1162   expectDiagnosticError("invalid matching format specification in expression",
1163                         Tester.parseSubst("%X a,FOO").takeError());
1164 
1165   // Valid expression with 2 or more operands.
1166   EXPECT_THAT_EXPECTED(Tester.parseSubst("FOO+3"), Succeeded());
1167   EXPECT_THAT_EXPECTED(Tester.parseSubst("FOO+0xC"), Succeeded());
1168   EXPECT_THAT_EXPECTED(Tester.parseSubst("FOO-3+FOO"), Succeeded());
1169 
1170   expectDiagnosticError("unsupported operation '/'",
1171                         Tester.parseSubst("@LINE/2").takeError());
1172 
1173   expectDiagnosticError("missing operand in expression",
1174                         Tester.parseSubst("@LINE+").takeError());
1175 
1176   // Errors in RHS operand are bubbled up by parseBinop() to
1177   // parseNumericSubstitutionBlock().
1178   expectDiagnosticError("invalid operand format",
1179                         Tester.parseSubst("@LINE+%VAR").takeError());
1180 
1181   // Invalid legacy @LINE expression with non literal rhs.
1182   expectDiagnosticError(
1183       "invalid operand format",
1184       Tester.parseSubst("@LINE+@LINE", /*IsLegacyNumExpr=*/true).takeError());
1185 
1186   // Invalid legacy @LINE expression made of a single literal.
1187   expectDiagnosticError(
1188       "invalid variable name",
1189       Tester.parseSubst("2", /*IsLegacyNumExpr=*/true).takeError());
1190 
1191   // Invalid hex literal in legacy @LINE expression.
1192   expectDiagnosticError(
1193       "unexpected characters at end of expression 'xC'",
1194       Tester.parseSubst("@LINE+0xC", /*LegacyLineExpr=*/true).takeError());
1195 
1196   // Valid expression with format specifier.
1197   EXPECT_THAT_EXPECTED(Tester.parseSubst("%u, FOO"), Succeeded());
1198   EXPECT_THAT_EXPECTED(Tester.parseSubst("%d, FOO"), Succeeded());
1199   EXPECT_THAT_EXPECTED(Tester.parseSubst("%x, FOO"), Succeeded());
1200   EXPECT_THAT_EXPECTED(Tester.parseSubst("%X, FOO"), Succeeded());
1201 
1202   // Valid expression with precision specifier.
1203   EXPECT_THAT_EXPECTED(Tester.parseSubst("%.8u, FOO"), Succeeded());
1204   EXPECT_THAT_EXPECTED(Tester.parseSubst("%.8, FOO"), Succeeded());
1205 
1206   // Valid legacy @LINE expression.
1207   EXPECT_THAT_EXPECTED(Tester.parseSubst("@LINE+2", /*IsLegacyNumExpr=*/true),
1208                        Succeeded());
1209 
1210   // Invalid legacy @LINE expression with more than 2 operands.
1211   expectDiagnosticError(
1212       "unexpected characters at end of expression '+@LINE'",
1213       Tester.parseSubst("@LINE+2+@LINE", /*IsLegacyNumExpr=*/true).takeError());
1214   expectDiagnosticError(
1215       "unexpected characters at end of expression '+2'",
1216       Tester.parseSubst("@LINE+2+2", /*IsLegacyNumExpr=*/true).takeError());
1217 
1218   // Valid expression with several variables when their implicit formats do not
1219   // conflict.
1220   EXPECT_THAT_EXPECTED(Tester.parseSubst("FOO+VAR_UNSIGNED"), Succeeded());
1221 
1222   // Valid implicit format conflict in presence of explicit formats.
1223   EXPECT_THAT_EXPECTED(Tester.parseSubst("%X,FOO+VAR_LOWER_HEX"), Succeeded());
1224 
1225   // Implicit format conflict.
1226   expectDiagnosticError(
1227       "implicit format conflict between 'FOO' (%u) and "
1228       "'VAR_LOWER_HEX' (%x), need an explicit format specifier",
1229       Tester.parseSubst("FOO+VAR_LOWER_HEX").takeError());
1230 
1231   // Simple parenthesized expressions:
1232   EXPECT_THAT_EXPECTED(Tester.parseSubst("(1)"), Succeeded());
1233   EXPECT_THAT_EXPECTED(Tester.parseSubst("(1+1)"), Succeeded());
1234   EXPECT_THAT_EXPECTED(Tester.parseSubst("(1)+1"), Succeeded());
1235   EXPECT_THAT_EXPECTED(Tester.parseSubst("((1)+1)"), Succeeded());
1236   EXPECT_THAT_EXPECTED(Tester.parseSubst("((1)+X)"), Succeeded());
1237   EXPECT_THAT_EXPECTED(Tester.parseSubst("((X)+Y)"), Succeeded());
1238 
1239   expectDiagnosticError("missing operand in expression",
1240                         Tester.parseSubst("(").takeError());
1241   expectDiagnosticError("missing ')' at end of nested expression",
1242                         Tester.parseSubst("(1").takeError());
1243   expectDiagnosticError("missing operand in expression",
1244                         Tester.parseSubst("(1+").takeError());
1245   expectDiagnosticError("missing ')' at end of nested expression",
1246                         Tester.parseSubst("(1+1").takeError());
1247   expectDiagnosticError("missing ')' at end of nested expression",
1248                         Tester.parseSubst("((1+2+3").takeError());
1249   expectDiagnosticError("missing ')' at end of nested expression",
1250                         Tester.parseSubst("((1+2)+3").takeError());
1251 
1252   // Test missing operation between operands:
1253   expectDiagnosticError("unsupported operation '('",
1254                         Tester.parseSubst("(1)(2)").takeError());
1255   expectDiagnosticError("unsupported operation '('",
1256                         Tester.parseSubst("2(X)").takeError());
1257 
1258   // Test more closing than opening parentheses. The diagnostic messages are
1259   // not ideal, but for now simply check that we reject invalid input.
1260   expectDiagnosticError("invalid matching constraint or operand format",
1261                         Tester.parseSubst(")").takeError());
1262   expectDiagnosticError("unsupported operation ')'",
1263                         Tester.parseSubst("1)").takeError());
1264   expectDiagnosticError("unsupported operation ')'",
1265                         Tester.parseSubst("(1+2))").takeError());
1266   expectDiagnosticError("unsupported operation ')'",
1267                         Tester.parseSubst("(2))").takeError());
1268   expectDiagnosticError("unsupported operation ')'",
1269                         Tester.parseSubst("(1))(").takeError());
1270 
1271   // Valid expression with function call.
1272   EXPECT_THAT_EXPECTED(Tester.parseSubst("add(FOO,3)"), Succeeded());
1273   EXPECT_THAT_EXPECTED(Tester.parseSubst("add (FOO,3)"), Succeeded());
1274   // Valid expression with nested function call.
1275   EXPECT_THAT_EXPECTED(Tester.parseSubst("add(FOO, min(BAR,10))"), Succeeded());
1276   // Valid expression with function call taking expression as argument.
1277   EXPECT_THAT_EXPECTED(Tester.parseSubst("add(FOO, (BAR+10) + 3)"),
1278                        Succeeded());
1279   EXPECT_THAT_EXPECTED(Tester.parseSubst("add(FOO, min (BAR,10) + 3)"),
1280                        Succeeded());
1281   // Valid expression with variable named the same as a function.
1282   EXPECT_THAT_EXPECTED(Tester.parseSubst("add"), Succeeded());
1283   EXPECT_THAT_EXPECTED(Tester.parseSubst("add+FOO"), Succeeded());
1284   EXPECT_THAT_EXPECTED(Tester.parseSubst("FOO+add"), Succeeded());
1285   EXPECT_THAT_EXPECTED(Tester.parseSubst("add(add,add)+add"), Succeeded());
1286 
1287   // Malformed call syntax.
1288   expectDiagnosticError("missing ')' at end of call expression",
1289                         Tester.parseSubst("add(FOO,(BAR+7)").takeError());
1290   expectDiagnosticError("missing ')' at end of call expression",
1291                         Tester.parseSubst("add(FOO,min(BAR,7)").takeError());
1292   expectDiagnosticError("missing argument",
1293                         Tester.parseSubst("add(FOO,)").takeError());
1294   expectDiagnosticError("missing argument",
1295                         Tester.parseSubst("add(,FOO)").takeError());
1296   expectDiagnosticError("missing argument",
1297                         Tester.parseSubst("add(FOO,,3)").takeError());
1298 
1299   // Valid call, but to an unknown function.
1300   expectDiagnosticError("call to undefined function 'bogus_function'",
1301                         Tester.parseSubst("bogus_function(FOO,3)").takeError());
1302   expectDiagnosticError("call to undefined function '@add'",
1303                         Tester.parseSubst("@add(2,3)").takeError());
1304   expectDiagnosticError("call to undefined function '$add'",
1305                         Tester.parseSubst("$add(2,3)").takeError());
1306   expectDiagnosticError("call to undefined function 'FOO'",
1307                         Tester.parseSubst("FOO(2,3)").takeError());
1308   expectDiagnosticError("call to undefined function 'FOO'",
1309                         Tester.parseSubst("FOO (2,3)").takeError());
1310 
1311   // Valid call, but with incorrect argument count.
1312   expectDiagnosticError("function 'add' takes 2 arguments but 1 given",
1313                         Tester.parseSubst("add(FOO)").takeError());
1314   expectDiagnosticError("function 'add' takes 2 arguments but 3 given",
1315                         Tester.parseSubst("add(FOO,3,4)").takeError());
1316 
1317   // Valid call, but not part of a valid expression.
1318   expectDiagnosticError("unsupported operation 'a'",
1319                         Tester.parseSubst("2add(FOO,2)").takeError());
1320   expectDiagnosticError("unsupported operation 'a'",
1321                         Tester.parseSubst("FOO add(FOO,2)").takeError());
1322   expectDiagnosticError("unsupported operation 'a'",
1323                         Tester.parseSubst("add(FOO,2)add(FOO,2)").takeError());
1324 }
1325 
1326 TEST_F(FileCheckTest, ParsePattern) {
1327   PatternTester Tester;
1328 
1329   // Invalid space in string substitution.
1330   EXPECT_TRUE(Tester.parsePattern("[[ BAR]]"));
1331 
1332   // Invalid variable name in string substitution.
1333   EXPECT_TRUE(Tester.parsePattern("[[42INVALID]]"));
1334 
1335   // Invalid string variable definition.
1336   EXPECT_TRUE(Tester.parsePattern("[[@PAT:]]"));
1337   EXPECT_TRUE(Tester.parsePattern("[[PAT+2:]]"));
1338 
1339   // Collision with numeric variable.
1340   EXPECT_TRUE(Tester.parsePattern("[[FOO:]]"));
1341 
1342   // Invalid use of string variable.
1343   EXPECT_TRUE(Tester.parsePattern("[[FOO-BAR]]"));
1344 
1345   // Valid use of string variable.
1346   EXPECT_FALSE(Tester.parsePattern("[[BAR]]"));
1347 
1348   // Valid string variable definition.
1349   EXPECT_FALSE(Tester.parsePattern("[[PAT:[0-9]+]]"));
1350 
1351   // Invalid numeric substitution.
1352   EXPECT_TRUE(Tester.parsePattern("[[#42INVALID]]"));
1353 
1354   // Valid numeric substitution.
1355   EXPECT_FALSE(Tester.parsePattern("[[#FOO]]"));
1356 
1357   // Valid legacy @LINE expression.
1358   EXPECT_FALSE(Tester.parsePattern("[[@LINE+2]]"));
1359 
1360   // Invalid legacy @LINE expression with non decimal literal.
1361   EXPECT_TRUE(Tester.parsePattern("[[@LINE+0x3]]"));
1362 }
1363 
1364 TEST_F(FileCheckTest, Match) {
1365   PatternTester Tester;
1366 
1367   // Check a substitution error is diagnosed.
1368   ASSERT_FALSE(Tester.parsePattern("[[#%u, -1]]"));
1369   expectDiagnosticError(
1370       "unable to substitute variable or numeric expression: overflow error",
1371       Tester.match("").takeError());
1372 
1373   // Check matching an empty expression only matches a number.
1374   Tester.initNextPattern();
1375   ASSERT_FALSE(Tester.parsePattern("[[#]]"));
1376   expectNotFoundError(Tester.match("FAIL").takeError());
1377   EXPECT_THAT_EXPECTED(Tester.match("18"), Succeeded());
1378 
1379   // Check matching a definition only matches a number with the right format.
1380   Tester.initNextPattern();
1381   ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR:]]"));
1382   expectNotFoundError(Tester.match("FAIL").takeError());
1383   expectNotFoundError(Tester.match("").takeError());
1384   EXPECT_THAT_EXPECTED(Tester.match("18"), Succeeded());
1385   Tester.initNextPattern();
1386   Tester.parsePattern("[[#%u,NUMVAR_UNSIGNED:]]");
1387   expectNotFoundError(Tester.match("C").takeError());
1388   EXPECT_THAT_EXPECTED(Tester.match("20"), Succeeded());
1389   Tester.initNextPattern();
1390   Tester.parsePattern("[[#%x,NUMVAR_LOWER_HEX:]]");
1391   expectNotFoundError(Tester.match("g").takeError());
1392   expectNotFoundError(Tester.match("C").takeError());
1393   EXPECT_THAT_EXPECTED(Tester.match("c"), Succeeded());
1394   Tester.initNextPattern();
1395   Tester.parsePattern("[[#%X,NUMVAR_UPPER_HEX:]]");
1396   expectNotFoundError(Tester.match("H").takeError());
1397   expectNotFoundError(Tester.match("b").takeError());
1398   EXPECT_THAT_EXPECTED(Tester.match("B"), Succeeded());
1399 
1400   // Check matching expressions with no explicit format matches the values in
1401   // the right format.
1402   Tester.initNextPattern();
1403   Tester.parsePattern("[[#NUMVAR_UNSIGNED-5]]");
1404   expectNotFoundError(Tester.match("f").takeError());
1405   expectNotFoundError(Tester.match("F").takeError());
1406   EXPECT_THAT_EXPECTED(Tester.match("15"), Succeeded());
1407   Tester.initNextPattern();
1408   Tester.parsePattern("[[#NUMVAR_LOWER_HEX+1]]");
1409   expectNotFoundError(Tester.match("13").takeError());
1410   expectNotFoundError(Tester.match("D").takeError());
1411   EXPECT_THAT_EXPECTED(Tester.match("d"), Succeeded());
1412   Tester.initNextPattern();
1413   Tester.parsePattern("[[#NUMVAR_UPPER_HEX+1]]");
1414   expectNotFoundError(Tester.match("12").takeError());
1415   expectNotFoundError(Tester.match("c").takeError());
1416   EXPECT_THAT_EXPECTED(Tester.match("C"), Succeeded());
1417 
1418   // Check matching an undefined variable returns a NotFound error.
1419   Tester.initNextPattern();
1420   ASSERT_FALSE(Tester.parsePattern("100"));
1421   expectNotFoundError(Tester.match("101").takeError());
1422 
1423   // Check matching the defined variable matches the correct number only.
1424   Tester.initNextPattern();
1425   ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR]]"));
1426   EXPECT_THAT_EXPECTED(Tester.match("18"), Succeeded());
1427 
1428   // Check matching several substitutions does not match them independently.
1429   Tester.initNextPattern();
1430   ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR]] [[#NUMVAR+2]]"));
1431   expectNotFoundError(Tester.match("19 21").takeError());
1432   expectNotFoundError(Tester.match("18 21").takeError());
1433   EXPECT_THAT_EXPECTED(Tester.match("18 20"), Succeeded());
1434 
1435   // Check matching a numeric expression using @LINE after a match failure uses
1436   // the correct value for @LINE.
1437   Tester.initNextPattern();
1438   ASSERT_FALSE(Tester.parsePattern("[[#@LINE]]"));
1439   // Ok, @LINE matches the current line number.
1440   EXPECT_THAT_EXPECTED(Tester.match(std::to_string(Tester.getLineNumber())),
1441                        Succeeded());
1442   Tester.initNextPattern();
1443   // Match with substitution failure.
1444   ASSERT_FALSE(Tester.parsePattern("[[#UNKNOWN1+UNKNOWN2]]"));
1445   expectSameErrors<ErrorDiagnostic>(
1446       {"undefined variable: UNKNOWN1", "undefined variable: UNKNOWN2"},
1447       Tester.match("FOO").takeError());
1448   Tester.initNextPattern();
1449   // Check that @LINE matches the later (given the calls to initNextPattern())
1450   // line number.
1451   EXPECT_FALSE(Tester.parsePattern("[[#@LINE]]"));
1452   EXPECT_THAT_EXPECTED(Tester.match(std::to_string(Tester.getLineNumber())),
1453                        Succeeded());
1454 }
1455 
1456 TEST_F(FileCheckTest, MatchParen) {
1457   PatternTester Tester;
1458   // Check simple parenthesized expressions
1459   Tester.initNextPattern();
1460   ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR:]]"));
1461   expectNotFoundError(Tester.match("FAIL").takeError());
1462   expectNotFoundError(Tester.match("").takeError());
1463   EXPECT_THAT_EXPECTED(Tester.match("18"), Succeeded());
1464 
1465   Tester.initNextPattern();
1466   ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR + (2 + 2)]]"));
1467   expectNotFoundError(Tester.match("21").takeError());
1468   EXPECT_THAT_EXPECTED(Tester.match("22"), Succeeded());
1469   Tester.initNextPattern();
1470   ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR + (2)]]"));
1471   EXPECT_THAT_EXPECTED(Tester.match("20"), Succeeded());
1472   Tester.initNextPattern();
1473   ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR+(2)]]"));
1474   EXPECT_THAT_EXPECTED(Tester.match("20"), Succeeded());
1475   Tester.initNextPattern();
1476   ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR+(NUMVAR)]]"));
1477   EXPECT_THAT_EXPECTED(Tester.match("36"), Succeeded());
1478 
1479   // Check nested parenthesized expressions:
1480   Tester.initNextPattern();
1481   ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR+(2+(2))]]"));
1482   EXPECT_THAT_EXPECTED(Tester.match("22"), Succeeded());
1483   Tester.initNextPattern();
1484   ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR+(2+(NUMVAR))]]"));
1485   EXPECT_THAT_EXPECTED(Tester.match("38"), Succeeded());
1486   Tester.initNextPattern();
1487   ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR+((((NUMVAR))))]]"));
1488   EXPECT_THAT_EXPECTED(Tester.match("36"), Succeeded());
1489   Tester.initNextPattern();
1490   ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR+((((NUMVAR)))-1)-1]]"));
1491   EXPECT_THAT_EXPECTED(Tester.match("34"), Succeeded());
1492 
1493   // Parentheses can also be the first character after the '#':
1494   Tester.initNextPattern();
1495   ASSERT_FALSE(Tester.parsePattern("[[#(NUMVAR)]]"));
1496   EXPECT_THAT_EXPECTED(Tester.match("18"), Succeeded());
1497   Tester.initNextPattern();
1498   ASSERT_FALSE(Tester.parsePattern("[[#(NUMVAR+2)]]"));
1499   EXPECT_THAT_EXPECTED(Tester.match("20"), Succeeded());
1500 }
1501 
1502 TEST_F(FileCheckTest, MatchBuiltinFunctions) {
1503   PatternTester Tester;
1504   // Esnure #NUMVAR has the expected value.
1505   Tester.initNextPattern();
1506   ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR:]]"));
1507   expectNotFoundError(Tester.match("FAIL").takeError());
1508   expectNotFoundError(Tester.match("").takeError());
1509   EXPECT_THAT_EXPECTED(Tester.match("18"), Succeeded());
1510 
1511   // Check each builtin function generates the expected result.
1512   Tester.initNextPattern();
1513   ASSERT_FALSE(Tester.parsePattern("[[#add(NUMVAR,13)]]"));
1514   EXPECT_THAT_EXPECTED(Tester.match("31"), Succeeded());
1515   Tester.initNextPattern();
1516   ASSERT_FALSE(Tester.parsePattern("[[#div(NUMVAR,3)]]"));
1517   EXPECT_THAT_EXPECTED(Tester.match("6"), Succeeded());
1518   Tester.initNextPattern();
1519   ASSERT_FALSE(Tester.parsePattern("[[#max(NUMVAR,5)]]"));
1520   EXPECT_THAT_EXPECTED(Tester.match("18"), Succeeded());
1521   Tester.initNextPattern();
1522   ASSERT_FALSE(Tester.parsePattern("[[#max(NUMVAR,99)]]"));
1523   EXPECT_THAT_EXPECTED(Tester.match("99"), Succeeded());
1524   Tester.initNextPattern();
1525   ASSERT_FALSE(Tester.parsePattern("[[#min(NUMVAR,5)]]"));
1526   EXPECT_THAT_EXPECTED(Tester.match("5"), Succeeded());
1527   Tester.initNextPattern();
1528   ASSERT_FALSE(Tester.parsePattern("[[#min(NUMVAR,99)]]"));
1529   EXPECT_THAT_EXPECTED(Tester.match("18"), Succeeded());
1530   Tester.initNextPattern();
1531   ASSERT_FALSE(Tester.parsePattern("[[#mul(NUMVAR,3)]]"));
1532   EXPECT_THAT_EXPECTED(Tester.match("54"), Succeeded());
1533   Tester.initNextPattern();
1534   ASSERT_FALSE(Tester.parsePattern("[[#sub(NUMVAR,7)]]"));
1535   EXPECT_THAT_EXPECTED(Tester.match("11"), Succeeded());
1536 
1537   // Check nested function calls.
1538   Tester.initNextPattern();
1539   ASSERT_FALSE(Tester.parsePattern("[[#add(min(7,2),max(4,10))]]"));
1540   EXPECT_THAT_EXPECTED(Tester.match("12"), Succeeded());
1541 
1542   // Check function call that uses a variable of the same name.
1543   Tester.initNextPattern();
1544   ASSERT_FALSE(Tester.parsePattern("[[#add(add,add)+min (add,3)+add]]"));
1545   EXPECT_THAT_EXPECTED(Tester.match("24"), Succeeded());
1546 }
1547 
1548 TEST_F(FileCheckTest, Substitution) {
1549   SourceMgr SM;
1550   FileCheckPatternContext Context;
1551   EXPECT_THAT_ERROR(Context.defineCmdlineVariables({"FOO=BAR"}, SM),
1552                     Succeeded());
1553 
1554   // Substitution of an undefined string variable fails and error holds that
1555   // variable's name.
1556   StringSubstitution StringSubstitution(&Context, "VAR404", 42);
1557   Expected<std::string> SubstValue = StringSubstitution.getResult();
1558   expectUndefErrors({"VAR404"}, SubstValue.takeError());
1559 
1560   // Numeric substitution blocks constituted of defined numeric variables are
1561   // substituted for the variable's value.
1562   NumericVariable NVar("N", ExpressionFormat(ExpressionFormat::Kind::Unsigned),
1563                        1);
1564   NVar.setValue(ExpressionValue(10u));
1565   auto NVarUse = std::make_unique<NumericVariableUse>("N", &NVar);
1566   auto ExpressionN = std::make_unique<Expression>(
1567       std::move(NVarUse), ExpressionFormat(ExpressionFormat::Kind::HexUpper));
1568   NumericSubstitution SubstitutionN(&Context, "N", std::move(ExpressionN),
1569                                     /*InsertIdx=*/30);
1570   SubstValue = SubstitutionN.getResult();
1571   ASSERT_THAT_EXPECTED(SubstValue, Succeeded());
1572   EXPECT_EQ("A", *SubstValue);
1573 
1574   // Substitution of an undefined numeric variable fails, error holds name of
1575   // undefined variable.
1576   NVar.clearValue();
1577   SubstValue = SubstitutionN.getResult();
1578   expectUndefErrors({"N"}, SubstValue.takeError());
1579 
1580   // Substitution of a defined string variable returns the right value.
1581   Pattern P(Check::CheckPlain, &Context, 1);
1582   StringSubstitution = llvm::StringSubstitution(&Context, "FOO", 42);
1583   SubstValue = StringSubstitution.getResult();
1584   ASSERT_THAT_EXPECTED(SubstValue, Succeeded());
1585   EXPECT_EQ("BAR", *SubstValue);
1586 }
1587 
1588 TEST_F(FileCheckTest, FileCheckContext) {
1589   FileCheckPatternContext Cxt;
1590   SourceMgr SM;
1591 
1592   // No definition.
1593   EXPECT_THAT_ERROR(Cxt.defineCmdlineVariables({}, SM), Succeeded());
1594 
1595   // Missing equal sign.
1596   expectDiagnosticError("missing equal sign in global definition",
1597                         Cxt.defineCmdlineVariables({"LocalVar"}, SM));
1598   expectDiagnosticError("missing equal sign in global definition",
1599                         Cxt.defineCmdlineVariables({"#LocalNumVar"}, SM));
1600 
1601   // Empty variable name.
1602   expectDiagnosticError("empty variable name",
1603                         Cxt.defineCmdlineVariables({"=18"}, SM));
1604   expectDiagnosticError("empty variable name",
1605                         Cxt.defineCmdlineVariables({"#=18"}, SM));
1606 
1607   // Invalid variable name.
1608   expectDiagnosticError("invalid variable name",
1609                         Cxt.defineCmdlineVariables({"18LocalVar=18"}, SM));
1610   expectDiagnosticError("invalid variable name",
1611                         Cxt.defineCmdlineVariables({"#18LocalNumVar=18"}, SM));
1612 
1613   // Name conflict between pattern and numeric variable.
1614   expectDiagnosticError(
1615       "string variable with name 'LocalVar' already exists",
1616       Cxt.defineCmdlineVariables({"LocalVar=18", "#LocalVar=36"}, SM));
1617   Cxt = FileCheckPatternContext();
1618   expectDiagnosticError(
1619       "numeric variable with name 'LocalNumVar' already exists",
1620       Cxt.defineCmdlineVariables({"#LocalNumVar=18", "LocalNumVar=36"}, SM));
1621   Cxt = FileCheckPatternContext();
1622 
1623   // Invalid numeric value for numeric variable.
1624   expectUndefErrors({"x"}, Cxt.defineCmdlineVariables({"#LocalNumVar=x"}, SM));
1625 
1626   // Define local variables from command-line.
1627   std::vector<StringRef> GlobalDefines;
1628   // Clear local variables to remove dummy numeric variable x that
1629   // parseNumericSubstitutionBlock would have created and stored in
1630   // GlobalNumericVariableTable.
1631   Cxt.clearLocalVars();
1632   GlobalDefines.emplace_back("LocalVar=FOO");
1633   GlobalDefines.emplace_back("EmptyVar=");
1634   GlobalDefines.emplace_back("#LocalNumVar1=18");
1635   GlobalDefines.emplace_back("#%x,LocalNumVar2=LocalNumVar1+2");
1636   GlobalDefines.emplace_back("#LocalNumVar3=0xc");
1637   ASSERT_THAT_ERROR(Cxt.defineCmdlineVariables(GlobalDefines, SM), Succeeded());
1638 
1639   // Create @LINE pseudo numeric variable and check it is present by matching
1640   // it.
1641   size_t LineNumber = 1;
1642   Pattern P(Check::CheckPlain, &Cxt, LineNumber);
1643   FileCheckRequest Req;
1644   Cxt.createLineVariable();
1645   ASSERT_FALSE(P.parsePattern("[[@LINE]]", "CHECK", SM, Req));
1646   Pattern::MatchResult Res = P.match("1", SM);
1647   ASSERT_THAT_ERROR(std::move(Res.TheError), Succeeded());
1648 
1649 #ifndef NDEBUG
1650   // Recreating @LINE pseudo numeric variable fails.
1651   EXPECT_DEATH(Cxt.createLineVariable(),
1652                "@LINE pseudo numeric variable already created");
1653 #endif
1654 
1655   // Check defined variables are present and undefined ones are absent.
1656   StringRef LocalVarStr = "LocalVar";
1657   StringRef LocalNumVar1Ref = bufferize(SM, "LocalNumVar1");
1658   StringRef LocalNumVar2Ref = bufferize(SM, "LocalNumVar2");
1659   StringRef LocalNumVar3Ref = bufferize(SM, "LocalNumVar3");
1660   StringRef EmptyVarStr = "EmptyVar";
1661   StringRef UnknownVarStr = "UnknownVar";
1662   Expected<StringRef> LocalVar = Cxt.getPatternVarValue(LocalVarStr);
1663   P = Pattern(Check::CheckPlain, &Cxt, ++LineNumber);
1664   std::optional<NumericVariable *> DefinedNumericVariable;
1665   Expected<std::unique_ptr<Expression>> ExpressionPointer =
1666       P.parseNumericSubstitutionBlock(LocalNumVar1Ref, DefinedNumericVariable,
1667                                       /*IsLegacyLineExpr=*/false, LineNumber,
1668                                       &Cxt, SM);
1669   ASSERT_THAT_EXPECTED(LocalVar, Succeeded());
1670   EXPECT_EQ(*LocalVar, "FOO");
1671   Expected<StringRef> EmptyVar = Cxt.getPatternVarValue(EmptyVarStr);
1672   Expected<StringRef> UnknownVar = Cxt.getPatternVarValue(UnknownVarStr);
1673   ASSERT_THAT_EXPECTED(ExpressionPointer, Succeeded());
1674   Expected<ExpressionValue> ExpressionVal =
1675       (*ExpressionPointer)->getAST()->eval();
1676   ASSERT_THAT_EXPECTED(ExpressionVal, Succeeded());
1677   EXPECT_EQ(cantFail(ExpressionVal->getSignedValue()), 18);
1678   ExpressionPointer = P.parseNumericSubstitutionBlock(
1679       LocalNumVar2Ref, DefinedNumericVariable,
1680       /*IsLegacyLineExpr=*/false, LineNumber, &Cxt, SM);
1681   ASSERT_THAT_EXPECTED(ExpressionPointer, Succeeded());
1682   ExpressionVal = (*ExpressionPointer)->getAST()->eval();
1683   ASSERT_THAT_EXPECTED(ExpressionVal, Succeeded());
1684   EXPECT_EQ(cantFail(ExpressionVal->getSignedValue()), 20);
1685   ExpressionPointer = P.parseNumericSubstitutionBlock(
1686       LocalNumVar3Ref, DefinedNumericVariable,
1687       /*IsLegacyLineExpr=*/false, LineNumber, &Cxt, SM);
1688   ASSERT_THAT_EXPECTED(ExpressionPointer, Succeeded());
1689   ExpressionVal = (*ExpressionPointer)->getAST()->eval();
1690   ASSERT_THAT_EXPECTED(ExpressionVal, Succeeded());
1691   EXPECT_EQ(cantFail(ExpressionVal->getSignedValue()), 12);
1692   ASSERT_THAT_EXPECTED(EmptyVar, Succeeded());
1693   EXPECT_EQ(*EmptyVar, "");
1694   expectUndefErrors({std::string(UnknownVarStr)}, UnknownVar.takeError());
1695 
1696   // Clear local variables and check they become absent.
1697   Cxt.clearLocalVars();
1698   LocalVar = Cxt.getPatternVarValue(LocalVarStr);
1699   expectUndefErrors({std::string(LocalVarStr)}, LocalVar.takeError());
1700   // Check a numeric expression's evaluation fails if called after clearing of
1701   // local variables, if it was created before. This is important because local
1702   // variable clearing due to --enable-var-scope happens after numeric
1703   // expressions are linked to the numeric variables they use.
1704   expectUndefErrors({"LocalNumVar3"},
1705                     (*ExpressionPointer)->getAST()->eval().takeError());
1706   P = Pattern(Check::CheckPlain, &Cxt, ++LineNumber);
1707   ExpressionPointer = P.parseNumericSubstitutionBlock(
1708       LocalNumVar1Ref, DefinedNumericVariable, /*IsLegacyLineExpr=*/false,
1709       LineNumber, &Cxt, SM);
1710   ASSERT_THAT_EXPECTED(ExpressionPointer, Succeeded());
1711   ExpressionVal = (*ExpressionPointer)->getAST()->eval();
1712   expectUndefErrors({"LocalNumVar1"}, ExpressionVal.takeError());
1713   ExpressionPointer = P.parseNumericSubstitutionBlock(
1714       LocalNumVar2Ref, DefinedNumericVariable, /*IsLegacyLineExpr=*/false,
1715       LineNumber, &Cxt, SM);
1716   ASSERT_THAT_EXPECTED(ExpressionPointer, Succeeded());
1717   ExpressionVal = (*ExpressionPointer)->getAST()->eval();
1718   expectUndefErrors({"LocalNumVar2"}, ExpressionVal.takeError());
1719   EmptyVar = Cxt.getPatternVarValue(EmptyVarStr);
1720   expectUndefErrors({"EmptyVar"}, EmptyVar.takeError());
1721   // Clear again because parseNumericSubstitutionBlock would have created a
1722   // dummy variable and stored it in GlobalNumericVariableTable.
1723   Cxt.clearLocalVars();
1724 
1725   // Redefine global variables and check variables are defined again.
1726   GlobalDefines.emplace_back("$GlobalVar=BAR");
1727   GlobalDefines.emplace_back("#$GlobalNumVar=36");
1728   ASSERT_THAT_ERROR(Cxt.defineCmdlineVariables(GlobalDefines, SM), Succeeded());
1729   StringRef GlobalVarStr = "$GlobalVar";
1730   StringRef GlobalNumVarRef = bufferize(SM, "$GlobalNumVar");
1731   Expected<StringRef> GlobalVar = Cxt.getPatternVarValue(GlobalVarStr);
1732   ASSERT_THAT_EXPECTED(GlobalVar, Succeeded());
1733   EXPECT_EQ(*GlobalVar, "BAR");
1734   P = Pattern(Check::CheckPlain, &Cxt, ++LineNumber);
1735   ExpressionPointer = P.parseNumericSubstitutionBlock(
1736       GlobalNumVarRef, DefinedNumericVariable, /*IsLegacyLineExpr=*/false,
1737       LineNumber, &Cxt, SM);
1738   ASSERT_THAT_EXPECTED(ExpressionPointer, Succeeded());
1739   ExpressionVal = (*ExpressionPointer)->getAST()->eval();
1740   ASSERT_THAT_EXPECTED(ExpressionVal, Succeeded());
1741   EXPECT_EQ(cantFail(ExpressionVal->getSignedValue()), 36);
1742 
1743   // Clear local variables and check global variables remain defined.
1744   Cxt.clearLocalVars();
1745   EXPECT_THAT_EXPECTED(Cxt.getPatternVarValue(GlobalVarStr), Succeeded());
1746   P = Pattern(Check::CheckPlain, &Cxt, ++LineNumber);
1747   ExpressionPointer = P.parseNumericSubstitutionBlock(
1748       GlobalNumVarRef, DefinedNumericVariable, /*IsLegacyLineExpr=*/false,
1749       LineNumber, &Cxt, SM);
1750   ASSERT_THAT_EXPECTED(ExpressionPointer, Succeeded());
1751   ExpressionVal = (*ExpressionPointer)->getAST()->eval();
1752   ASSERT_THAT_EXPECTED(ExpressionVal, Succeeded());
1753   EXPECT_EQ(cantFail(ExpressionVal->getSignedValue()), 36);
1754 }
1755 
1756 TEST_F(FileCheckTest, CapturedVarDiags) {
1757   PatternTester Tester;
1758   ASSERT_FALSE(Tester.parsePattern("[[STRVAR:[a-z]+]] [[#NUMVAR:@LINE]]"));
1759   EXPECT_THAT_EXPECTED(Tester.match("foobar 2"), Succeeded());
1760   std::vector<FileCheckDiag> Diags;
1761   Tester.printVariableDefs(FileCheckDiag::MatchFoundAndExpected, Diags);
1762   EXPECT_EQ(Diags.size(), 2ul);
1763   for (FileCheckDiag Diag : Diags) {
1764     EXPECT_EQ(Diag.CheckTy, Check::CheckPlain);
1765     EXPECT_EQ(Diag.MatchTy, FileCheckDiag::MatchFoundAndExpected);
1766     EXPECT_EQ(Diag.InputStartLine, 1u);
1767     EXPECT_EQ(Diag.InputEndLine, 1u);
1768   }
1769   EXPECT_EQ(Diags[0].InputStartCol, 1u);
1770   EXPECT_EQ(Diags[0].InputEndCol, 7u);
1771   EXPECT_EQ(Diags[1].InputStartCol, 8u);
1772   EXPECT_EQ(Diags[1].InputEndCol, 9u);
1773   EXPECT_EQ(Diags[0].Note, "captured var \"STRVAR\"");
1774   EXPECT_EQ(Diags[1].Note, "captured var \"NUMVAR\"");
1775 }
1776 } // namespace
1777