//=== unittests/CodeGen/DemangleTrapReasonInDebugInfo.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/CodeGen/ModuleBuilder.h" #include "llvm/ADT/StringRef.h" #include "gtest/gtest.h" using namespace clang::CodeGen; void CheckValidCommon(llvm::StringRef FuncName, const char *ExpectedCategory, const char *ExpectedMessage) { auto MaybeTrapReason = DemangleTrapReasonInDebugInfo(FuncName); ASSERT_TRUE(MaybeTrapReason.has_value()); auto [Category, Message] = MaybeTrapReason.value(); ASSERT_STREQ(Category.str().c_str(), ExpectedCategory); ASSERT_STREQ(Message.str().c_str(), ExpectedMessage); } void CheckInvalidCommon(llvm::StringRef FuncName) { auto MaybeTrapReason = DemangleTrapReasonInDebugInfo(FuncName); ASSERT_TRUE(!MaybeTrapReason.has_value()); } TEST(DemangleTrapReasonInDebugInfo, Valid) { std::string FuncName(ClangTrapPrefix); FuncName += "$trap category$trap message"; CheckValidCommon(FuncName, "trap category", "trap message"); } TEST(DemangleTrapReasonInDebugInfo, ValidEmptyCategory) { std::string FuncName(ClangTrapPrefix); FuncName += "$$trap message"; CheckValidCommon(FuncName, "", "trap message"); } TEST(DemangleTrapReasonInDebugInfo, ValidEmptyMessage) { std::string FuncName(ClangTrapPrefix); FuncName += "$trap category$"; CheckValidCommon(FuncName, "trap category", ""); } TEST(DemangleTrapReasonInDebugInfo, ValidAllEmpty) { // `__builtin_verbose_trap` actually allows this // currently. However, we should probably disallow this in Sema because having // an empty category and message completely defeats the point of using the // builtin (#165981). std::string FuncName(ClangTrapPrefix); FuncName += "$$"; CheckValidCommon(FuncName, "", ""); } TEST(DemangleTrapReasonInDebugInfo, InvalidOnlyPrefix) { std::string FuncName(ClangTrapPrefix); CheckInvalidCommon(FuncName); } TEST(DemangleTrapReasonInDebugInfo, Invalid) { std::string FuncName("foo"); CheckInvalidCommon(FuncName); } TEST(DemangleTrapReasonInDebugInfo, InvalidEmpty) { CheckInvalidCommon(""); }