1*67e74705SXin Li // RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-store region -verify %s 2*67e74705SXin Li // expected-no-diagnostics 3*67e74705SXin Li 4*67e74705SXin Li // Intra-procedural C++ tests. 5*67e74705SXin Li 6*67e74705SXin Li // Test relaxing function call arguments invalidation to be aware of const 7*67e74705SXin Li // arguments. radar://10595327 8*67e74705SXin Li struct InvalidateArgs { 9*67e74705SXin Li void ttt(const int &nptr); 10*67e74705SXin Li virtual void vttt(const int *nptr); 11*67e74705SXin Li }; 12*67e74705SXin Li struct ChildOfInvalidateArgs: public InvalidateArgs { 13*67e74705SXin Li virtual void vttt(const int *nptr); 14*67e74705SXin Li }; declarationFun(int x)15*67e74705SXin Livoid declarationFun(int x) { 16*67e74705SXin Li InvalidateArgs t; 17*67e74705SXin Li x = 3; 18*67e74705SXin Li int y = x + 1; 19*67e74705SXin Li int *p = 0; 20*67e74705SXin Li t.ttt(y); 21*67e74705SXin Li if (x == y) 22*67e74705SXin Li y = *p; // no-warning 23*67e74705SXin Li } virtualFun(int x)24*67e74705SXin Livoid virtualFun(int x) { 25*67e74705SXin Li ChildOfInvalidateArgs t; 26*67e74705SXin Li InvalidateArgs *pt = &t; 27*67e74705SXin Li x = 3; 28*67e74705SXin Li int y = x + 1; 29*67e74705SXin Li int *p = 0; 30*67e74705SXin Li pt->vttt(&y); 31*67e74705SXin Li if (x == y) 32*67e74705SXin Li y = *p; // no-warning 33*67e74705SXin Li } 34