16cee434eSArtem Dergachev // RUN: %clang_analyze_cc1 -analyzer-checker=core,optin.cplusplus.VirtualCall \ 26cee434eSArtem Dergachev // RUN: -analyzer-config optin.cplusplus.VirtualCall:ShowFixIts=true \ 36cee434eSArtem Dergachev // RUN: %s 2>&1 | FileCheck -check-prefix=TEXT %s 4*abdd33c8SCharusso 5*abdd33c8SCharusso // RUN: %check_analyzer_fixit %s %t \ 6*abdd33c8SCharusso // RUN: -analyzer-checker=core,optin.cplusplus.VirtualCall \ 76cee434eSArtem Dergachev // RUN: -analyzer-config optin.cplusplus.VirtualCall:ShowFixIts=true \ 8*abdd33c8SCharusso // RUN: -analyzer-output=plist -o %t.plist 96cee434eSArtem Dergachev // RUN: cat %t.plist | FileCheck -check-prefix=PLIST %s 106cee434eSArtem Dergachev 116cee434eSArtem Dergachev struct S { 126cee434eSArtem Dergachev virtual void foo(); SS136cee434eSArtem Dergachev S() { 146cee434eSArtem Dergachev foo(); 156cee434eSArtem Dergachev // expected-warning@-1{{Call to virtual method 'S::foo' during construction bypasses virtual dispatch}} 16*abdd33c8SCharusso // CHECK-FIXES: S() { 17*abdd33c8SCharusso // CHECK-FIXES-NEXT: S::foo(); 18*abdd33c8SCharusso // CHECK-FIXES-NEXT: } 196cee434eSArtem Dergachev } 206cee434eSArtem Dergachev ~S(); 216cee434eSArtem Dergachev }; 226cee434eSArtem Dergachev 236cee434eSArtem Dergachev // TEXT: warning: Call to virtual method 'S::foo' during construction 246cee434eSArtem Dergachev // TEXT-SAME: bypasses virtual dispatch 256cee434eSArtem Dergachev // TEXT-NEXT: foo(); 266cee434eSArtem Dergachev // TEXT-NEXT: ^~~~~ 276cee434eSArtem Dergachev // TEXT-NEXT: S:: 286cee434eSArtem Dergachev // TEXT-NEXT: 1 warning generated. 296cee434eSArtem Dergachev 306cee434eSArtem Dergachev // PLIST: <key>fixits</key> 316cee434eSArtem Dergachev // PLIST-NEXT: <array> 326cee434eSArtem Dergachev // PLIST-NEXT: <dict> 336cee434eSArtem Dergachev // PLIST-NEXT: <key>remove_range</key> 346cee434eSArtem Dergachev // PLIST-NEXT: <array> 356cee434eSArtem Dergachev // PLIST-NEXT: <dict> 36*abdd33c8SCharusso // PLIST-NEXT: <key>line</key><integer>14</integer> 376cee434eSArtem Dergachev // PLIST-NEXT: <key>col</key><integer>5</integer> 386cee434eSArtem Dergachev // PLIST-NEXT: <key>file</key><integer>0</integer> 396cee434eSArtem Dergachev // PLIST-NEXT: </dict> 406cee434eSArtem Dergachev // PLIST-NEXT: <dict> 41*abdd33c8SCharusso // PLIST-NEXT: <key>line</key><integer>14</integer> 426cee434eSArtem Dergachev // PLIST-NEXT: <key>col</key><integer>4</integer> 436cee434eSArtem Dergachev // PLIST-NEXT: <key>file</key><integer>0</integer> 446cee434eSArtem Dergachev // PLIST-NEXT: </dict> 456cee434eSArtem Dergachev // PLIST-NEXT: </array> 466cee434eSArtem Dergachev // PLIST-NEXT: <key>insert_string</key><string>S::</string> 476cee434eSArtem Dergachev // PLIST-NEXT: </dict> 486cee434eSArtem Dergachev // PLIST-NEXT: </array> 49