[clang] e6f63a9 - [clang][dataflow] Bail out if input is Objective-C++. (#86479)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Mar 25 06:08:28 PDT 2024
Author: martinboehme
Date: 2024-03-25T14:08:25+01:00
New Revision: e6f63a942a45e3545332cd9a43982a69a4d5667b
URL: https://github.com/llvm/llvm-project/commit/e6f63a942a45e3545332cd9a43982a69a4d5667b
DIFF: https://github.com/llvm/llvm-project/commit/e6f63a942a45e3545332cd9a43982a69a4d5667b.diff
LOG: [clang][dataflow] Bail out if input is Objective-C++. (#86479)
We only ever intended to support C++, but the condition we were testing
allowed
Objective-C++ code by mistake.
Added:
Modified:
clang/lib/Analysis/FlowSensitive/AdornedCFG.cpp
clang/unittests/Analysis/FlowSensitive/DeterminismTest.cpp
clang/unittests/Analysis/FlowSensitive/TransferTest.cpp
Removed:
################################################################################
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