]> granicus.if.org Git - clang/commit
[analyzer] Be more forgiving about calling methods on struct rvalues.
authorJordan Rose <jordan_rose@apple.com>
Wed, 5 Sep 2012 17:11:26 +0000 (17:11 +0000)
committerJordan Rose <jordan_rose@apple.com>
Wed, 5 Sep 2012 17:11:26 +0000 (17:11 +0000)
commit6ebea89be233eaba5e29de8cf3524ad150c860bb
tree68df18a7da0db02be83366a8d97a83193d69cd54
parent4e45dba1c0234eec7b7c348dbbf568c5ac9fc471
[analyzer] Be more forgiving about calling methods on struct rvalues.

The problem is that the value of 'this' in a C++ member function call
should always be a region (or NULL). However, if the object is an rvalue,
it has no associated region (only a conjured symbol or LazyCompoundVal).
For now, we handle this in two ways:

1) Actually respect MaterializeTemporaryExpr. Before, it was relying on
   CXXConstructExpr to create temporary regions for all struct values.
   Now it just does the right thing: if the value is not in a temporary
   region, create one.

2) Have CallEvent recognize the case where its 'this' pointer is a
   non-region, and just return UnknownVal to keep from confusing clients.

The long-term problem is being tracked internally in <rdar://problem/12137950>,
but this makes many test cases pass.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@163220 91177308-0d34-0410-b5e6-96231b3b80d8
include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h
lib/StaticAnalyzer/Core/CallEvent.cpp
lib/StaticAnalyzer/Core/ExprEngineCXX.cpp
test/Analysis/array-struct-region.cpp [new file with mode: 0644]
test/Analysis/reference.cpp