diff options
Diffstat (limited to 'test/Analysis/array-struct-region.cpp')
-rw-r--r-- | test/Analysis/array-struct-region.cpp | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/test/Analysis/array-struct-region.cpp b/test/Analysis/array-struct-region.cpp index 12ae5d3..4777686 100644 --- a/test/Analysis/array-struct-region.cpp +++ b/test/Analysis/array-struct-region.cpp @@ -21,7 +21,7 @@ struct S { #if __cplusplus const struct S *operator -(const struct S &s) { return &s; } -bool operator ~(const struct S &s) { return &s != &s; } +bool operator ~(const struct S &s) { return (&s) != &s; } #endif @@ -173,4 +173,27 @@ void testImmediateUseOp() { clang_analyzer_eval(getConstrainedFieldRefOp(getS()) == 42); // expected-warning{{TRUE}} } +namespace EmptyClass { + struct Base { + int& x; + + Base(int& x) : x(x) {} + }; + + struct Derived : public Base { + Derived(int& x) : Base(x) {} + + void operator=(int a) { x = a; } + }; + + Derived ref(int& a) { return Derived(a); } + + // There used to be a warning here, because analyzer treated Derived as empty. + int test() { + int a; + ref(a) = 42; + return a; // no warning + } +} + #endif |