-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[clang][dataflow] Bail out if input is Objective-C++. #86479
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[clang][dataflow] Bail out if input is Objective-C++. #86479
Conversation
We only ever intended to support C++, but the condition we were testing allowed Objective-C++ code by mistake.
@llvm/pr-subscribers-clang @llvm/pr-subscribers-clang-analysis Author: None (martinboehme) ChangesWe only ever intended to support C++, but the condition we were testing allowed Full diff: https://github.com/llvm/llvm-project/pull/86479.diff 3 Files Affected:
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++"));
}
|
✅ With the latest revision this PR passed the C/C++ code formatter. |
✅ With the latest revision this PR passed the Python code formatter. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks!
/cherry-pick e6f63a9 |
Error: Command failed due to missing milestone. |
We only ever intended to support C++, but the condition we were testing allowed
Objective-C++ code by mistake.