]> granicus.if.org Git - clang/commitdiff
[analyzer] Fix crash when analyzing C++ code.
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Fri, 18 Feb 2011 21:24:56 +0000 (21:24 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Fri, 18 Feb 2011 21:24:56 +0000 (21:24 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@125963 91177308-0d34-0410-b5e6-96231b3b80d8

lib/StaticAnalyzer/Core/AggExprVisitor.cpp
test/Analysis/cxx-crashes.cpp

index 9804163d9e2305ac0ceebd159ae1bf75ef5adf9a..e80cf9b4a331c0131530b724282c50ae405cdb60 100644 (file)
@@ -39,6 +39,7 @@ public:
 
   void VisitCastExpr(CastExpr *E);
   void VisitCXXConstructExpr(CXXConstructExpr *E);
+  void VisitCXXMemberCallExpr(CXXMemberCallExpr *E);
 };
 }
 
@@ -48,6 +49,7 @@ void AggExprVisitor::VisitCastExpr(CastExpr *E) {
     assert(0 && "Unhandled cast kind");
   case CK_NoOp:
   case CK_ConstructorConversion:
+  case CK_UserDefinedConversion:
     Visit(E->getSubExpr());
     break;
   }
@@ -57,6 +59,10 @@ void AggExprVisitor::VisitCXXConstructExpr(CXXConstructExpr *E) {
   Eng.VisitCXXConstructExpr(E, Dest, Pred, DstSet);
 }
 
+void AggExprVisitor::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
+  Eng.VisitCXXMemberCallExpr(E, Pred, DstSet);
+}
+
 void ExprEngine::VisitAggExpr(const Expr *E, const MemRegion *Dest, 
                                 ExplodedNode *Pred, ExplodedNodeSet &Dst) {
   AggExprVisitor(Dest, Pred, Dst, *this).Visit(const_cast<Expr *>(E));
index 720850cc5c47bd6decf7f7d4281dc65269ce4ea7..db2298df8917ab39da667afcd417197297f570e0 100644 (file)
@@ -5,3 +5,17 @@ int f1(char *dst) {
   char *q = dst + 3;
   return !(q >= p);
 }
+
+namespace {
+
+struct A { };
+struct B {
+  operator A();
+};
+
+A f(char *dst) {
+  B b;
+  return b;
+}
+
+}