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