Commit 040c39d5 authored by Artem Dergachev's avatar Artem Dergachev
Browse files

[analyzer] Fix false positive on introspection of a block's internal layout.

When implementation of the block runtime is available, we should not
warn that block layout fields are uninitialized simply because they're
on the stack.
parent d5abaaf1
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -1951,7 +1951,8 @@ RegionStoreManager::getBindingForFieldOrElementCommon(RegionBindingsConstRef B,
    if (hasSymbolicIndex)
      return UnknownVal();

    if (!hasPartialLazyBinding)
    // Additionally allow introspection of a block's internal layout.
    if (!hasPartialLazyBinding && !isa<BlockDataRegion>(R->getBaseRegion()))
      return UndefinedVal();
  }

+9 −0
Original line number Diff line number Diff line
@@ -47,6 +47,10 @@ typedef struct __aslmsg *aslmsg;
aslclient asl_open(const char *ident, const char *facility, uint32_t opts);
int asl_log(aslclient asl, aslmsg msg, int level, const char *format, ...) __attribute__((__format__ (__printf__, 4, 5)));

struct Block_layout {
  int flags;
};

//===----------------------------------------------------------------------===//
// Begin actual test cases.
//===----------------------------------------------------------------------===//
@@ -241,3 +245,8 @@ void call_block_with_fewer_arguments() {
  b(); // expected-warning {{Block taking 1 argument is called with fewer (0)}}
}
#endif

int getBlockFlags() {
  int x = 0;
  return ((struct Block_layout *)^{ (void)x; })->flags; // no-warning
}