NoQ added inline comments.
================ Comment at: lib/StaticAnalyzer/Core/ExprEngine.cpp:1104 + // expression classes separately. + if (!isa<ObjCBoxedExpr>(Ex)) + for (auto Child : Ex->children()) { ---------------- dcoughlin wrote: > What is special about ObjCBoxedExpr here? Naively I would have expected that > we'd want to keep the old behavior for ObjCArrayLiteral and ObjCDictionary as > well. Yeah, i got it all wrong initially. If a `char *` is boxed into `NSString`, it doesn't escape, even though `Val` would be the string pointer - which is what i wanted to express here; we already had a test for that. Similarly, if, say, a C struct is boxed, the pointer to the struct doesn't escape. However, contents of the struct do escape! Conveniently, `Val` here would be the (lazy) compound value, similarly to `std::initializer_list`, so we don't need to explicitly avoid escaping the struct pointer itself. If a C integer is boxed, nothing escapes, of course, until we implement the mythical non-pointer escape (eg. file descriptor integers in stream checker should escape when they get boxed). For `ObjC{Array,Dictionary}Expr`essions, contents of the array/dictionary do actually escape. However, because only `NSObject`s can be within such boxed literals, and `RetainCountChecker` ignores escapes, it is largely irrelevant how we behave in this case - i've even no idea how to test that, so i guess it could be fixed later. Reference: https://clang.llvm.org/docs/ObjectiveCLiterals.html https://reviews.llvm.org/D35216 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits