[clang] 2252c5c - Revert "[clang][dataflow] Don't propagate result objects in unevaluated contexts (#90438)"

via cfe-commits cfe-commits at lists.llvm.org
Thu May 2 03:52:58 PDT 2024


Author: Weaver
Date: 2024-05-02T11:51:45+01:00
New Revision: 2252c5c42b95dd12dda0c7fb1b2811f943b21949

URL: https://github.com/llvm/llvm-project/commit/2252c5c42b95dd12dda0c7fb1b2811f943b21949
DIFF: https://github.com/llvm/llvm-project/commit/2252c5c42b95dd12dda0c7fb1b2811f943b21949.diff

LOG: Revert "[clang][dataflow] Don't propagate result objects in unevaluated contexts (#90438)"

This reverts commit 597a3150e932a9423c65b5ea4b53dd431aff5865.

Caused test failure on the following buildbot:
https://lab.llvm.org/buildbot/#/builders/216/builds/38446

Added: 
    

Modified: 
    clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp
    clang/unittests/Analysis/FlowSensitive/TransferTest.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp b/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp
index cb6c8b2ef1072b..d79e734402892a 100644
--- a/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp
+++ b/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp
@@ -350,17 +350,6 @@ class ResultObjectVisitor : public RecursiveASTVisitor<ResultObjectVisitor> {
     return RecursiveASTVisitor<ResultObjectVisitor>::TraverseDecl(D);
   }
 
-  // Don't traverse expressions in unevaluated contexts, as we don't model
-  // fields that are only used in these.
-  // Note: The operand of the `noexcept` operator is an unevaluated operand, but
-  // nevertheless it appears in the Clang CFG, so we don't exclude it here.
-  bool TraverseDecltypeTypeLoc(DecltypeTypeLoc) { return true; }
-  bool TraverseTypeOfExprTypeLoc(TypeOfExprTypeLoc) { return true; }
-  bool TraverseCXXTypeidExpr(CXXTypeidExpr *) { return true; }
-  bool TraverseUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *) {
-    return true;
-  }
-
   bool TraverseBindingDecl(BindingDecl *BD) {
     // `RecursiveASTVisitor` doesn't traverse holding variables for
     // `BindingDecl`s by itself, so we need to tell it to.

diff  --git a/clang/unittests/Analysis/FlowSensitive/TransferTest.cpp b/clang/unittests/Analysis/FlowSensitive/TransferTest.cpp
index 95d5f569c0c824..301bec32c0cf1d 100644
--- a/clang/unittests/Analysis/FlowSensitive/TransferTest.cpp
+++ b/clang/unittests/Analysis/FlowSensitive/TransferTest.cpp
@@ -3331,58 +3331,6 @@ TEST(TransferTest, ResultObjectLocationDontVisitNestedRecordDecl) {
          ASTContext &ASTCtx) {});
 }
 
-TEST(TransferTest, ResultObjectLocationDontVisitUnevaluatedContexts) {
-  // This is a crash repro.
-  // We used to crash because when propagating result objects, we would visit
-  // unevaluated contexts, but we don't model fields used only in these.
-
-  auto testFunction = [](llvm::StringRef Code, llvm::StringRef TargetFun) {
-    runDataflow(
-        Code,
-        [](const llvm::StringMap<DataflowAnalysisState<NoopLattice>> &Results,
-           ASTContext &ASTCtx) {},
-        LangStandard::lang_gnucxx17,
-        /* ApplyBuiltinTransfer= */ true, TargetFun);
-  };
-
-  std::string Code = R"cc(
-    // Definitions needed for `typeid`.
-    namespace std {
-      class type_info {};
-      class bad_typeid {};
-    }  // namespace std
-
-    struct S1 {};
-    struct S2 { S1 s1; };
-
-    // We test each type of unevaluated context from a 
diff erent target
-    // function. Some types of unevaluated contexts may actually cause the
-    // field `s1` to be modeled, and we don't want this to "pollute" the tests
-    // for the other unevaluated contexts.
-    void decltypeTarget() {
-        decltype(S2{}) Dummy;
-    }
-    void typeofTarget() {
-        typeof(S2{}) Dummy;
-    }
-    void typeidTarget() {
-        typeid(S2{});
-    }
-    void sizeofTarget() {
-        sizeof(S2{});
-    }
-    void noexceptTarget() {
-        noexcept(S2{});
-    }
-  )cc";
-
-  testFunction(Code, "decltypeTarget");
-  testFunction(Code, "typeofTarget");
-  testFunction(Code, "typeidTarget");
-  testFunction(Code, "sizeofTarget");
-  testFunction(Code, "noexceptTarget");
-}
-
 TEST(TransferTest, StaticCast) {
   std::string Code = R"(
     void target(int Foo) {


        


More information about the cfe-commits mailing list