[clang] [clang][dataflow] Bail out if input is Objective-C++. (PR #86479)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Mar 25 02:08:13 PDT 2024
https://github.com/martinboehme created https://github.com/llvm/llvm-project/pull/86479
We only ever intended to support C++, but the condition we were testing allowed
Objective-C++ code by mistake.
>From cfbd1b3633b78a2323eb5aebcb637112eeaa1571 Mon Sep 17 00:00:00 2001
From: Martin Braenne <mboehme at google.com>
Date: Mon, 25 Mar 2024 09:07:01 +0000
Subject: [PATCH] [clang][dataflow] Bail out if input is Objective-C++.
We only ever intended to support C++, but the condition we were testing allowed
Objective-C++ code by mistake.
---
.../lib/Analysis/FlowSensitive/AdornedCFG.cpp | 2 +-
.../FlowSensitive/DeterminismTest.cpp | 4 ++-
.../Analysis/FlowSensitive/TransferTest.cpp | 33 +++++++++++++++----
3 files changed, 31 insertions(+), 8 deletions(-)
diff --git a/clang/lib/Analysis/FlowSensitive/AdornedCFG.cpp b/clang/lib/Analysis/FlowSensitive/AdornedCFG.cpp
index daa73bed1bd9f5..255543021a998c 100644
--- a/clang/lib/Analysis/FlowSensitive/AdornedCFG.cpp
+++ b/clang/lib/Analysis/FlowSensitive/AdornedCFG.cpp
@@ -144,7 +144,7 @@ llvm::Expected<AdornedCFG> AdornedCFG::build(const Decl &D, Stmt &S,
// The shape of certain elements of the AST can vary depending on the
// language. We currently only support C++.
- if (!C.getLangOpts().CPlusPlus)
+ if (!C.getLangOpts().CPlusPlus || C.getLangOpts().ObjC)
return llvm::createStringError(
std::make_error_code(std::errc::invalid_argument),
"Can only analyze C++");
diff --git a/clang/unittests/Analysis/FlowSensitive/DeterminismTest.cpp b/clang/unittests/Analysis/FlowSensitive/DeterminismTest.cpp
index e794bd4943f232..a2cbfb1ff5826b 100644
--- a/clang/unittests/Analysis/FlowSensitive/DeterminismTest.cpp
+++ b/clang/unittests/Analysis/FlowSensitive/DeterminismTest.cpp
@@ -30,7 +30,9 @@ namespace clang::dataflow {
// flow-condition at function exit.
std::string analyzeAndPrintExitCondition(llvm::StringRef Code) {
DataflowAnalysisContext DACtx(std::make_unique<WatchedLiteralsSolver>());
- clang::TestAST AST(Code);
+ TestInputs Inputs(Code);
+ Inputs.Language = TestLanguage::Lang_CXX17;
+ clang::TestAST AST(Inputs);
const auto *Target =
cast<FunctionDecl>(test::findValueDecl(AST.context(), "target"));
Environment InitEnv(DACtx, *Target);
diff --git a/clang/unittests/Analysis/FlowSensitive/TransferTest.cpp b/clang/unittests/Analysis/FlowSensitive/TransferTest.cpp
index 1d3b268976a767..ca055a462a2866 100644
--- a/clang/unittests/Analysis/FlowSensitive/TransferTest.cpp
+++ b/clang/unittests/Analysis/FlowSensitive/TransferTest.cpp
@@ -17,6 +17,7 @@
#include "clang/Analysis/FlowSensitive/StorageLocation.h"
#include "clang/Analysis/FlowSensitive/Value.h"
#include "clang/Basic/LangStandard.h"
+#include "clang/Testing/TestAST.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Testing/Support/Error.h"
@@ -135,12 +136,32 @@ const Formula &getFormula(const ValueDecl &D, const Environment &Env) {
}
TEST(TransferTest, CNotSupported) {
- std::string Code = R"(
- void target() {}
- )";
- ASSERT_THAT_ERROR(checkDataflowWithNoopAnalysis(
- Code, [](const auto &, auto &) {}, {BuiltinOptions{}},
- LangStandard::lang_c89),
+ TestInputs Inputs("void target() {}");
+ Inputs.Language = TestLanguage::Lang_C89;
+ clang::TestAST AST(Inputs);
+ const auto *Target =
+ cast<FunctionDecl>(test::findValueDecl(AST.context(), "target"));
+ ASSERT_THAT_ERROR(AdornedCFG::build(*Target).takeError(),
+ llvm::FailedWithMessage("Can only analyze C++"));
+}
+
+TEST(TransferTest, ObjectiveCNotSupported) {
+ TestInputs Inputs("void target() {}");
+ Inputs.Language = TestLanguage::Lang_OBJC;
+ clang::TestAST AST(Inputs);
+ const auto *Target =
+ cast<FunctionDecl>(test::findValueDecl(AST.context(), "target"));
+ ASSERT_THAT_ERROR(AdornedCFG::build(*Target).takeError(),
+ llvm::FailedWithMessage("Can only analyze C++"));
+}
+
+TEST(TransferTest, ObjectiveCXXNotSupported) {
+ TestInputs Inputs("void target() {}");
+ Inputs.Language = TestLanguage::Lang_OBJCXX;
+ clang::TestAST AST(Inputs);
+ const auto *Target =
+ cast<FunctionDecl>(test::findValueDecl(AST.context(), "target"));
+ ASSERT_THAT_ERROR(AdornedCFG::build(*Target).takeError(),
llvm::FailedWithMessage("Can only analyze C++"));
}
More information about the cfe-commits
mailing list