//===- unittests/Serialization/SourceLocationEncodingTests.cpp ------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "clang/Serialization/SourceLocationEncoding.h" #include "gtest/gtest.h" #include #include using namespace llvm; using namespace clang; namespace { // Convert a single source location into encoded form and back. // If ExpectedEncoded is provided, verify the encoded value too. // Loc is the raw (in-memory) form of SourceLocation. void roundTrip(SourceLocation::UIntTy Loc, std::optional ExpectedEncoded = std::nullopt) { uint64_t ActualEncoded = SourceLocationEncoding::encode( SourceLocation::getFromRawEncoding(Loc), /*BaseOffset=*/0, /*BaseModuleFileIndex=*/0); if (ExpectedEncoded) { ASSERT_EQ(ActualEncoded, *ExpectedEncoded) << "Encoding " << Loc; } SourceLocation::UIntTy DecodedEncoded = SourceLocationEncoding::decode(ActualEncoded).first.getRawEncoding(); ASSERT_EQ(DecodedEncoded, Loc) << "Decoding " << ActualEncoded; } constexpr SourceLocation::UIntTy MacroBit = 1 << (sizeof(SourceLocation::UIntTy) * CHAR_BIT - 1); constexpr SourceLocation::UIntTy Big = MacroBit >> 1; TEST(SourceLocationEncoding, Individual) { roundTrip(1, 2); roundTrip(100, 200); roundTrip(MacroBit, 1); roundTrip(MacroBit | 5, 11); roundTrip(Big); roundTrip(Big + 1); roundTrip(MacroBit | Big); roundTrip(MacroBit | (Big + 1)); } } // namespace