| 3032 | } |
| 3033 | |
| 3034 | void CheckClassImpl::getFirstVirtualFunctionCallStack( |
| 3035 | std::map<const Function *, std::list<const Token *>> & virtualFunctionCallsMap, |
| 3036 | const Token * callToken, |
| 3037 | std::list<const Token *> & pureFuncStack) |
| 3038 | { |
| 3039 | const Function *callFunction = callToken->function(); |
| 3040 | if (callFunction->isImplicitlyVirtual() && (!callFunction->isPure() || !callFunction->hasBody())) { |
| 3041 | pureFuncStack.push_back(callFunction->tokenDef); |
| 3042 | return; |
| 3043 | } |
| 3044 | auto found = utils::as_const(virtualFunctionCallsMap).find(callFunction); |
| 3045 | if (found == virtualFunctionCallsMap.cend() || found->second.empty()) { |
| 3046 | pureFuncStack.clear(); |
| 3047 | return; |
| 3048 | } |
| 3049 | const Token * firstCall = *found->second.cbegin(); |
| 3050 | pureFuncStack.push_back(firstCall); |
| 3051 | getFirstVirtualFunctionCallStack(virtualFunctionCallsMap, firstCall, pureFuncStack); |
| 3052 | } |
| 3053 | |
| 3054 | void CheckClassImpl::virtualFunctionCallInConstructorError( |
| 3055 | const Function * scopeFunction, |