diff options
-rw-r--r-- | mutator-lvl0.cpp | 55 |
1 files changed, 53 insertions, 2 deletions
diff --git a/mutator-lvl0.cpp b/mutator-lvl0.cpp index 1354f89..faa53ba 100644 --- a/mutator-lvl0.cpp +++ b/mutator-lvl0.cpp @@ -2890,7 +2890,8 @@ public: { const ImplicitCastExpr* ICE = MR.Nodes.getNodeAs<clang::ImplicitCastExpr>("atcdaddy"); - if ((ICE->getCastKind() == CK_IntegralCast) || (ICE->getCastKind() == CK_FloatingCast)) + if ((ICE->getCastKind() == CK_IntegralCast) || (ICE->getCastKind() == CK_FloatingCast) || \ + (ICE->getCastKind() == CK_FloatingComplexCast) || (ICE->getCastKind() == CK_IntegralComplexCast)) { SourceLocation SL = ICE->getLocStart(); SL = Devi::SourceLocationHasMacro(SL, Rewrite, "start"); @@ -2957,7 +2958,7 @@ public: } } - if (ICETypeSize < ChildTypeSize) + if (ICETypeSize < ChildTypeSize && !(CanonTypeChild->isComplexIntegerType() || CanonTypeChild->isComplexType())) { std::cout << "10.1/2 : " << "ImplicitCastExpr is narrowing: " << std::endl; std::cout << SL.printToString(*MR.SourceManager) << "\n" << std::endl; @@ -2965,6 +2966,56 @@ public: XMLDocOut.XMLAddNode(MR.Context, SL, "10.1/2", "ImplicitCastExpr is narrowing: "); JSONDocOUT.JSONAddElement(MR.Context, SL, "10.1/2", "ImplicitCastExpr is narrowing: "); } + + if (CanonTypeChild->isComplexIntegerType()) + { + if (ICETypeSize > ChildTypeSize) + { + std::cout << "10.3 : " << "ImplicitCastExpr is widening for complex integer type: " << std::endl; + std::cout << SL.printToString(*MR.SourceManager) << "\n" << std::endl; + + XMLDocOut.XMLAddNode(MR.Context, SL, "10.3", "ImplicitCastExpr is widening for complex integer type: "); + JSONDocOUT.JSONAddElement(MR.Context, SL, "10.3", "ImplicitCastExpr is widening for complex integer type: "); + } + + const ComplexType* ChildCPXType = CanonTypeChild->getAsComplexIntegerType(); + const ComplexType* DaddyCPXType = CanonTypeDaddy->getAsComplexIntegerType(); + + QualType DaddyCPXQT = DaddyCPXType->getElementType(); + QualType ChildCPXQT = ChildCPXType->getElementType(); + + const clang::Type* DaddyCPXElementType = DaddyCPXQT.getTypePtr(); + const clang::Type * ChildCPXElementType = ChildCPXQT.getTypePtr(); + + bool IsSignedCPXDaddy = DaddyCPXElementType->getAsPlaceholderType()->isSignedInteger(); + bool IsSignedCPXChild = ChildCPXElementType->getAsPlaceholderType()->isSignedInteger(); + bool IsUnsignedCPXDaddy = DaddyCPXElementType->getAsPlaceholderType()->isUnsignedInteger(); + bool IsUnsignedCPXChild = ChildCPXElementType->getAsPlaceholderType()->isUnsignedInteger(); + + //std::cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" << iscpxsigned << iscpxsigned2 << std::endl; + + if ((IsSignedCPXDaddy && IsUnsignedCPXChild) || (IsUnsignedCPXDaddy && IsSignedCPXChild)) + { + std::cout << "10.3 : " << "ImplicitCastExpr changes the signedness of the complex integer type: " << std::endl; + std::cout << SL.printToString(*MR.SourceManager) << "\n" << std::endl; + + XMLDocOut.XMLAddNode(MR.Context, SL, "10.3", "ImplicitCastExpr changes the signedness of the complex integer type: "); + JSONDocOUT.JSONAddElement(MR.Context, SL, "10.3", "ImplicitCastExpr changes the signedness of the complex integer type type: "); + } + } + + /*clang::Type::iSComplexIntegerType will not return true for the gnu extension of complex integers.*/ + if (!CanonTypeChild->isComplexIntegerType() && CanonTypeChild->isComplexType()) + { + if (ICETypeSize > ChildTypeSize) + { + std::cout << "10.4 : " << "ImplicitCastExpr is widening for complex float type: " << std::endl; + std::cout << SL.printToString(*MR.SourceManager) << "\n" << std::endl; + + XMLDocOut.XMLAddNode(MR.Context, SL, "10.4", "ImplicitCastExpr is widening for complex float type: "); + JSONDocOUT.JSONAddElement(MR.Context, SL, "10.4", "ImplicitCastExpr is widening for complex float type: "); + } + } } } } |