summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJordan Rose <jordan_rose@apple.com>2013-06-03 23:00:09 +0000
committerJordan Rose <jordan_rose@apple.com>2013-06-03 23:00:09 +0000
commit7ce598aeee556aa638ac19b2604a0a6b224df7f8 (patch)
tree45892f9a8a61786edcc55cdcf2e096df8e3d0487
parent5f16849b346355f53e721d3c87129ea224aca491 (diff)
downloadbcm5719-llvm-7ce598aeee556aa638ac19b2604a0a6b224df7f8.tar.gz
bcm5719-llvm-7ce598aeee556aa638ac19b2604a0a6b224df7f8.zip
[analyzer; new edges] Omit subexpression back-edges that span multiple lines.
A.1 -> A -> B becomes A.1 -> B This only applies if there's an edge from a subexpression to its parent expression, and that is immediately followed by another edge from the parent expression to a subsequent expression. Normally this is useful for bringing the edges back to the left side of the code, but when the subexpression is on a different line the backedge ends up looking strange, and may even obscure code. In these cases, it's better to just continue to the next top-level statement. llvm-svn: 183164
-rw-r--r--clang/lib/StaticAnalyzer/Core/BugReporter.cpp17
-rw-r--r--clang/test/Analysis/edges-new.mm34
2 files changed, 16 insertions, 35 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/BugReporter.cpp b/clang/lib/StaticAnalyzer/Core/BugReporter.cpp
index c19e12ca82a..305450aaeaa 100644
--- a/clang/lib/StaticAnalyzer/Core/BugReporter.cpp
+++ b/clang/lib/StaticAnalyzer/Core/BugReporter.cpp
@@ -2092,7 +2092,7 @@ static void simplifySimpleBranches(PathPieces &pieces) {
}
}
-/// Returns the number of bytes in the given SourceRange.
+/// Returns the number of bytes in the given (character-based) SourceRange.
///
/// If the locations in the range are not on the same line, returns None.
///
@@ -2413,6 +2413,21 @@ static bool optimizeEdges(PathPieces &path, SourceManager &SM,
!lexicalContains(PM, s1End, s1Start)) {
removeEdge = true;
}
+ // Trim edges from a subexpression back to the top level if the
+ // subexpression is on a different line.
+ //
+ // A.1 -> A -> B
+ // becomes
+ // A.1 -> B
+ //
+ // These edges just look ugly and don't usually add anything.
+ else if (s1Start && s2End &&
+ lexicalContains(PM, s1Start, s1End)) {
+ SourceRange EdgeRange(PieceI->getEndLocation().asLocation(),
+ PieceI->getStartLocation().asLocation());
+ if (!getLengthOnSingleLine(SM, EdgeRange).hasValue())
+ removeEdge = true;
+ }
}
if (removeEdge) {
diff --git a/clang/test/Analysis/edges-new.mm b/clang/test/Analysis/edges-new.mm
index 3b42d3c7a7b..7dcf0a454b9 100644
--- a/clang/test/Analysis/edges-new.mm
+++ b/clang/test/Analysis/edges-new.mm
@@ -12885,40 +12885,6 @@ void longLines() {
// CHECK-NEXT: <key>end</key>
// CHECK-NEXT: <array>
// CHECK-NEXT: <dict>
-// CHECK-NEXT: <key>line</key><integer>535</integer>
-// CHECK-NEXT: <key>col</key><integer>3</integer>
-// CHECK-NEXT: <key>file</key><integer>0</integer>
-// CHECK-NEXT: </dict>
-// CHECK-NEXT: <dict>
-// CHECK-NEXT: <key>line</key><integer>535</integer>
-// CHECK-NEXT: <key>col</key><integer>4</integer>
-// CHECK-NEXT: <key>file</key><integer>0</integer>
-// CHECK-NEXT: </dict>
-// CHECK-NEXT: </array>
-// CHECK-NEXT: </dict>
-// CHECK-NEXT: </array>
-// CHECK-NEXT: </dict>
-// CHECK-NEXT: <dict>
-// CHECK-NEXT: <key>kind</key><string>control</string>
-// CHECK-NEXT: <key>edges</key>
-// CHECK-NEXT: <array>
-// CHECK-NEXT: <dict>
-// CHECK-NEXT: <key>start</key>
-// CHECK-NEXT: <array>
-// CHECK-NEXT: <dict>
-// CHECK-NEXT: <key>line</key><integer>535</integer>
-// CHECK-NEXT: <key>col</key><integer>3</integer>
-// CHECK-NEXT: <key>file</key><integer>0</integer>
-// CHECK-NEXT: </dict>
-// CHECK-NEXT: <dict>
-// CHECK-NEXT: <key>line</key><integer>535</integer>
-// CHECK-NEXT: <key>col</key><integer>4</integer>
-// CHECK-NEXT: <key>file</key><integer>0</integer>
-// CHECK-NEXT: </dict>
-// CHECK-NEXT: </array>
-// CHECK-NEXT: <key>end</key>
-// CHECK-NEXT: <array>
-// CHECK-NEXT: <dict>
// CHECK-NEXT: <key>line</key><integer>537</integer>
// CHECK-NEXT: <key>col</key><integer>3</integer>
// CHECK-NEXT: <key>file</key><integer>0</integer>
OpenPOWER on IntegriCloud