]> granicus.if.org Git - clang/commitdiff
[analyzer] Fix an assertion fail in VirtualCallChecker
authorGabor Horvath <xazax.hun@gmail.com>
Thu, 21 Sep 2017 08:18:59 +0000 (08:18 +0000)
committerGabor Horvath <xazax.hun@gmail.com>
Thu, 21 Sep 2017 08:18:59 +0000 (08:18 +0000)
Differential Revision: https://reviews.llvm.org/D37978

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@313866 91177308-0d34-0410-b5e6-96231b3b80d8

lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp
test/Analysis/virtualcall.cpp

index ea1976e02023bece470909567157f72905bae4c5..c5010f53785a8858a469fac42c1823feb46d21d9 100644 (file)
@@ -146,7 +146,7 @@ static bool isVirtualCall(const CallExpr *CE) {
     if (CME->getQualifier())
       CallIsNonVirtual = true;
 
-    if (const Expr *Base = CME->getBase()->IgnoreImpCasts()) {
+    if (const Expr *Base = CME->getBase()) {
       // The most derived class is marked final.
       if (Base->getBestDynamicClassType()->hasAttr<FinalAttr>())
         CallIsNonVirtual = true;
index 135fa585ecec0e16f8a08b7ac9c239319b750c5c..c22a8463c04a17377b5d1ab7332092af14861005 100644 (file)
@@ -271,3 +271,24 @@ int main() {
 #if !PUREONLY
        //expected-note-re@-2 2{{{{^}}Calling '~E'}}
 #endif
+
+namespace PR34451 {
+struct a {
+  void b() {
+    a c[1];
+    c->b();
+  }
+};
+
+class e {
+ public:
+  void b() const;
+};
+
+class c {
+  void m_fn2() const;
+  e d[];
+};
+
+void c::m_fn2() const { d->b(); }
+}