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