diff options
-rw-r--r-- | lib/Analysis/UninitializedValuesV2.cpp | 4 | ||||
-rw-r--r-- | test/Sema/uninit-variables.c | 11 |
2 files changed, 13 insertions, 2 deletions
diff --git a/lib/Analysis/UninitializedValuesV2.cpp b/lib/Analysis/UninitializedValuesV2.cpp index b9a7676e62..0867b5e7f3 100644 --- a/lib/Analysis/UninitializedValuesV2.cpp +++ b/lib/Analysis/UninitializedValuesV2.cpp @@ -158,8 +158,8 @@ static BinaryOperator *getLogicalOperatorInChain(const CFGBlock *block) { llvm::BitVector &CFGBlockValues::getBitVector(const CFGBlock *block, const CFGBlock *dstBlock) { unsigned idx = block->getBlockID(); - if (dstBlock && block->succ_size() == 2 && block->pred_size() == 2) { - assert(block->getTerminator()); + if (dstBlock && block->succ_size() == 2 && block->pred_size() == 2 && + block->getTerminator()) { if (getLogicalOperatorInChain(block)) { if (*block->succ_begin() == dstBlock) return lazyCreate(vals[idx].first); diff --git a/test/Sema/uninit-variables.c b/test/Sema/uninit-variables.c index 513298d9ac..f52c1b5fc2 100644 --- a/test/Sema/uninit-variables.c +++ b/test/Sema/uninit-variables.c @@ -229,3 +229,14 @@ void test35(int x) { ^{ y = (x == 0); }(); } +// Test handling of indirect goto. +void test36() +{ + void **pc; // expected-warning{{use of uninitialized variable 'pc'}} expected-note{{ add initialization to silence this warning}} + void *dummy[] = { &&L1, &&L2 }; + L1: + goto *pc; // expected-note{{variable 'pc' is possibly uninitialized when used here}} + L2: + goto *pc; +} + |