diff options
| author | Devin Coughlin <dcoughlin@apple.com> | 2017-01-10 18:49:27 +0000 |
|---|---|---|
| committer | Devin Coughlin <dcoughlin@apple.com> | 2017-01-10 18:49:27 +0000 |
| commit | dc9834f91269c73702b6f0d7e428d169508a1386 (patch) | |
| tree | 11ad9d780b3c5919cda17d42d5a50445650981e8 /clang/test/Analysis/pointer-to-member.cpp | |
| parent | 3a6474ecbba47ae8916f2d8e48d2b098055b93d7 (diff) | |
| download | bcm5719-llvm-dc9834f91269c73702b6f0d7e428d169508a1386.tar.gz bcm5719-llvm-dc9834f91269c73702b6f0d7e428d169508a1386.zip | |
[analyzer] Treat pointers to static member functions as function pointers
Sema treats pointers to static member functions as having function pointer
type, so treat treat them as function pointer values in the analyzer as well.
This prevents an assertion failure in SValBuilder::evalBinOp caused by code
that expects function pointers to be Locs (in contrast, PointerToMember values
are nonlocs).
Differential Revision: https://reviews.llvm.org/D28033
llvm-svn: 291581
Diffstat (limited to 'clang/test/Analysis/pointer-to-member.cpp')
| -rw-r--r-- | clang/test/Analysis/pointer-to-member.cpp | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/clang/test/Analysis/pointer-to-member.cpp b/clang/test/Analysis/pointer-to-member.cpp index eef20627a13..039782b44b7 100644 --- a/clang/test/Analysis/pointer-to-member.cpp +++ b/clang/test/Analysis/pointer-to-member.cpp @@ -77,7 +77,8 @@ bool testDereferencing() { namespace testPointerToMemberFunction { struct A { virtual int foo() { return 1; } - int bar() { return 2; } + int bar() { return 2; } + int static staticMemberFunction(int p) { return p + 1; }; }; struct B : public A { @@ -111,11 +112,19 @@ namespace testPointerToMemberFunction { clang_analyzer_eval((APtr->*AFP)() == 3); // expected-warning{{TRUE}} } + + void testPointerToStaticMemberCall() { + int (*fPtr)(int) = &A::staticMemberFunction; + if (fPtr != 0) { // no-crash + clang_analyzer_eval(fPtr(2) == 3); // expected-warning{{TRUE}} + } + } } // end of testPointerToMemberFunction namespace namespace testPointerToMemberData { struct A { int i; + static int j; }; void testPointerToMemberData() { @@ -126,6 +135,13 @@ namespace testPointerToMemberData { a.*AMdPointer += 1; clang_analyzer_eval(a.i == 43); // expected-warning{{TRUE}} + + int *ptrToStaticField = &A::j; + if (ptrToStaticField != 0) { + *ptrToStaticField = 7; + clang_analyzer_eval(*ptrToStaticField == 7); // expected-warning{{TRUE}} + clang_analyzer_eval(A::j == 7); // expected-warning{{TRUE}} + } } } // end of testPointerToMemberData namespace |

