Skip to content

Commit f378e52

Browse files
authored
[clang][analysis] Fix flaky clang/test/Analysis/live-stmts.cpp test (2nd attempt) (llvm#127406)
In my previous attempt (llvm#126913) of fixing the flaky case was on a good track when I used the begin locations as a stable ordering. However, I forgot to consider the case when the begin locations are the same among the Exprs. In an `EXPENSIVE_CHECKS` build, arrays are randomly shuffled prior to sorting them. This exposed the flaky behavior much more often basically breaking the "stability" of the vector - as it should. Because of this, I had to revert the previous fix attempt in llvm#127034. To fix this, I use this time `Expr::getID` for a stable ID for an Expr. Hopefully fixes llvm#126619 Hopefully fixes llvm#126804
1 parent 501c77d commit f378e52

File tree

2 files changed

+26
-29
lines changed

2 files changed

+26
-29
lines changed

clang/lib/Analysis/LiveVariables.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -664,18 +664,18 @@ void LiveVariables::dumpExprLiveness(const SourceManager &M) {
664664
}
665665

666666
void LiveVariablesImpl::dumpExprLiveness(const SourceManager &M) {
667-
auto ByBeginLoc = [&M](const Expr *L, const Expr *R) {
668-
return M.isBeforeInTranslationUnit(L->getBeginLoc(), R->getBeginLoc());
667+
const ASTContext &Ctx = analysisContext.getASTContext();
668+
auto ByIDs = [&Ctx](const Expr *L, const Expr *R) {
669+
return L->getID(Ctx) < R->getID(Ctx);
669670
};
670671

671672
// Don't iterate over blockEndsToLiveness directly because it's not sorted.
672673
for (const CFGBlock *B : *analysisContext.getCFG()) {
673-
674674
llvm::errs() << "\n[ B" << B->getBlockID()
675675
<< " (live expressions at block exit) ]\n";
676676
std::vector<const Expr *> LiveExprs;
677677
llvm::append_range(LiveExprs, blocksEndToLiveness[B].liveExprs);
678-
llvm::sort(LiveExprs, ByBeginLoc);
678+
llvm::sort(LiveExprs, ByIDs);
679679
for (const Expr *E : LiveExprs) {
680680
llvm::errs() << "\n";
681681
E->dump();

clang/test/Analysis/live-stmts.cpp

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
// Disabling this flaky test, see https://github.com/llvm/llvm-project/pull/126913#issuecomment-2655850766
2-
// UNSUPPORTED: true
3-
41
// RUN: %clang_analyze_cc1 -w -analyzer-checker=debug.DumpLiveExprs %s 2>&1\
52
// RUN: | FileCheck %s
63

@@ -29,36 +26,36 @@ int testThatDumperWorks(int x, int y, int z) {
2926
// CHECK-EMPTY:
3027
// CHECK: [ B2 (live expressions at block exit) ]
3128
// CHECK-EMPTY:
32-
// CHECK-NEXT: ImplicitCastExpr {{.*}} <IntegralToBoolean>
33-
// CHECK-NEXT: `-ImplicitCastExpr {{.*}} <LValueToRValue>
34-
// CHECK-NEXT: `-DeclRefExpr {{.*}} 'x' 'int'
35-
// CHECK-EMPTY:
3629
// CHECK-NEXT: DeclRefExpr {{.*}} 'y' 'int'
3730
// CHECK-EMPTY:
3831
// CHECK-NEXT: DeclRefExpr {{.*}} 'z' 'int'
3932
// CHECK-EMPTY:
40-
// CHECK-EMPTY:
41-
// CHECK: [ B3 (live expressions at block exit) ]
42-
// CHECK-EMPTY:
4333
// CHECK-NEXT: ImplicitCastExpr {{.*}} <IntegralToBoolean>
4434
// CHECK-NEXT: `-ImplicitCastExpr {{.*}} <LValueToRValue>
4535
// CHECK-NEXT: `-DeclRefExpr {{.*}} 'x' 'int'
4636
// CHECK-EMPTY:
47-
// CHECK-NEXT: DeclRefExpr {{.*}} 'y' 'int'
4837
// CHECK-EMPTY:
49-
// CHECK-NEXT: DeclRefExpr {{.*}} 'z' 'int'
38+
// CHECK: [ B3 (live expressions at block exit) ]
5039
// CHECK-EMPTY:
40+
// CHECK-NEXT: DeclRefExpr {{.*}} 'y' 'int'
5141
// CHECK-EMPTY:
52-
// CHECK: [ B4 (live expressions at block exit) ]
42+
// CHECK-NEXT: DeclRefExpr {{.*}} 'z' 'int'
5343
// CHECK-EMPTY:
5444
// CHECK-NEXT: ImplicitCastExpr {{.*}} <IntegralToBoolean>
5545
// CHECK-NEXT: `-ImplicitCastExpr {{.*}} <LValueToRValue>
5646
// CHECK-NEXT: `-DeclRefExpr {{.*}} 'x' 'int'
5747
// CHECK-EMPTY:
48+
// CHECK-EMPTY:
49+
// CHECK: [ B4 (live expressions at block exit) ]
50+
// CHECK-EMPTY:
5851
// CHECK-NEXT: DeclRefExpr {{.*}} 'y' 'int'
5952
// CHECK-EMPTY:
6053
// CHECK-NEXT: DeclRefExpr {{.*}} 'z' 'int'
6154
// CHECK-EMPTY:
55+
// CHECK-NEXT: ImplicitCastExpr {{.*}} <IntegralToBoolean>
56+
// CHECK-NEXT: `-ImplicitCastExpr {{.*}} <LValueToRValue>
57+
// CHECK-NEXT: `-DeclRefExpr {{.*}} 'x' 'int'
58+
// CHECK-EMPTY:
6259
// CHECK-EMPTY:
6360
// CHECK: [ B5 (live expressions at block exit) ]
6461
// CHECK-EMPTY:
@@ -228,15 +225,15 @@ int logicalOpInTernary(bool b) {
228225
// CHECK: ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
229226
// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
230227
// CHECK-EMPTY:
228+
// CHECK: ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
229+
// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
230+
// CHECK-EMPTY:
231231
// CHECK: BinaryOperator {{.*}} '_Bool' '||'
232232
// CHECK: |-ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
233233
// CHECK: | `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
234234
// CHECK: `-ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
235235
// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
236236
// CHECK-EMPTY:
237-
// CHECK: ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
238-
// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
239-
// CHECK-EMPTY:
240237
// CHECK: IntegerLiteral {{.*}} 'int' 0
241238
// CHECK-EMPTY:
242239
// CHECK: IntegerLiteral {{.*}} 'int' 1
@@ -247,15 +244,15 @@ int logicalOpInTernary(bool b) {
247244
// CHECK: ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
248245
// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
249246
// CHECK-EMPTY:
247+
// CHECK: ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
248+
// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
249+
// CHECK-EMPTY:
250250
// CHECK: BinaryOperator {{.*}} '_Bool' '||'
251251
// CHECK: |-ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
252252
// CHECK: | `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
253253
// CHECK: `-ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
254254
// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
255255
// CHECK-EMPTY:
256-
// CHECK: ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
257-
// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
258-
// CHECK-EMPTY:
259256
// CHECK: IntegerLiteral {{.*}} 'int' 0
260257
// CHECK-EMPTY:
261258
// CHECK: IntegerLiteral {{.*}} 'int' 1
@@ -266,15 +263,15 @@ int logicalOpInTernary(bool b) {
266263
// CHECK: ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
267264
// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
268265
// CHECK-EMPTY:
266+
// CHECK: ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
267+
// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
268+
// CHECK-EMPTY:
269269
// CHECK: BinaryOperator {{.*}} '_Bool' '||'
270270
// CHECK: |-ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
271271
// CHECK: | `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
272272
// CHECK: `-ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
273273
// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
274274
// CHECK-EMPTY:
275-
// CHECK: ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
276-
// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
277-
// CHECK-EMPTY:
278275
// CHECK: IntegerLiteral {{.*}} 'int' 0
279276
// CHECK-EMPTY:
280277
// CHECK: IntegerLiteral {{.*}} 'int' 1
@@ -285,15 +282,15 @@ int logicalOpInTernary(bool b) {
285282
// CHECK: ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
286283
// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
287284
// CHECK-EMPTY:
285+
// CHECK: ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
286+
// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
287+
// CHECK-EMPTY:
288288
// CHECK: BinaryOperator {{.*}} '_Bool' '||'
289289
// CHECK: |-ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
290290
// CHECK: | `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
291291
// CHECK: `-ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
292292
// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
293293
// CHECK-EMPTY:
294-
// CHECK: ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
295-
// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
296-
// CHECK-EMPTY:
297294
// CHECK: IntegerLiteral {{.*}} 'int' 0
298295
// CHECK-EMPTY:
299296
// CHECK: IntegerLiteral {{.*}} 'int' 1

0 commit comments

Comments
 (0)