aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/Analysis/Lint.cpp6
-rw-r--r--test/Other/lint.ll1
2 files changed, 7 insertions, 0 deletions
diff --git a/lib/Analysis/Lint.cpp b/lib/Analysis/Lint.cpp
index a9d9724..5f1cb61 100644
--- a/lib/Analysis/Lint.cpp
+++ b/lib/Analysis/Lint.cpp
@@ -521,6 +521,12 @@ void Lint::visitIndirectBrInst(IndirectBrInst &I) {
Assert1(I.getNumDestinations() != 0,
"Undefined behavior: indirectbr with no destinations", &I);
+
+ for (unsigned i = 0, e = I.getNumDestinations(); i != e; ++i)
+ Assert1(I.getDestination(i)->hasAddressTaken(),
+ "Unusual: indirectbr destination has not "
+ "had its address taken",
+ &I);
}
void Lint::visitExtractElementInst(ExtractElementInst &I) {
diff --git a/test/Other/lint.ll b/test/Other/lint.ll
index fcef7ee..2163a42 100644
--- a/test/Other/lint.ll
+++ b/test/Other/lint.ll
@@ -102,6 +102,7 @@ define void @not_vararg(i8* %p) nounwind {
}
; CHECK: Undefined behavior: Branch to non-blockaddress
+; CHECK: Unusual: indirectbr destination has not had its address taken
define void @use_indbr() {
indirectbr i8* bitcast (i32()* @foo to i8*), [label %block]
block: