diff options
author | Reid Kleckner <rnk@google.com> | 2020-12-08 13:54:34 -0800 |
---|---|---|
committer | Reid Kleckner <rnk@google.com> | 2020-12-09 11:08:00 -0800 |
commit | d7098ff29c58dd08ede8314818b7de7fd2fea4cc (patch) | |
tree | 99303452f6abd90737527804fa3642b0ef79354d /clang/lib/CodeGen/CodeGenFunction.h | |
parent | 199ec40e7bcc8548282d803b1a43b1ae1d3b57ce (diff) | |
download | llvm-d7098ff29c58dd08ede8314818b7de7fd2fea4cc.zip llvm-d7098ff29c58dd08ede8314818b7de7fd2fea4cc.tar.gz llvm-d7098ff29c58dd08ede8314818b7de7fd2fea4cc.tar.bz2 |
De-templatify EmitCallArgs argument type checking, NFCI
This template exists to abstract over FunctionPrototype and
ObjCMethodDecl, which have similar APIs for storing parameter types. In
place of a template, use a PointerUnion with two cases to handle this.
Hopefully this improves readability, since the type of the prototype is
easier to discover. This allows me to sink this code, which is mostly
assertions, out of the header file and into the cpp file. I can also
simplify the overloaded methods for computing isGenericMethod, and get
rid of the second EmitCallArgs overload.
Differential Revision: https://reviews.llvm.org/D92883
Diffstat (limited to 'clang/lib/CodeGen/CodeGenFunction.h')
-rw-r--r-- | clang/lib/CodeGen/CodeGenFunction.h | 76 |
1 files changed, 8 insertions, 68 deletions
diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h index c2fbe37..142cf5d 100644 --- a/clang/lib/CodeGen/CodeGenFunction.h +++ b/clang/lib/CodeGen/CodeGenFunction.h @@ -4560,26 +4560,6 @@ private: Address Loc); public: -#ifndef NDEBUG - // Determine whether the given argument is an Objective-C method - // that may have type parameters in its signature. - static bool isObjCMethodWithTypeParams(const ObjCMethodDecl *method) { - const DeclContext *dc = method->getDeclContext(); - if (const ObjCInterfaceDecl *classDecl= dyn_cast<ObjCInterfaceDecl>(dc)) { - return classDecl->getTypeParamListAsWritten(); - } - - if (const ObjCCategoryDecl *catDecl = dyn_cast<ObjCCategoryDecl>(dc)) { - return catDecl->getTypeParamList(); - } - - return false; - } - - template<typename T> - static bool isObjCMethodWithTypeParams(const T *) { return false; } -#endif - enum class EvaluationOrder { ///! No language constraints on evaluation order. Default, @@ -4589,56 +4569,16 @@ public: ForceRightToLeft }; - /// EmitCallArgs - Emit call arguments for a function. - template <typename T> - void EmitCallArgs(CallArgList &Args, const T *CallArgTypeInfo, - llvm::iterator_range<CallExpr::const_arg_iterator> ArgRange, - AbstractCallee AC = AbstractCallee(), - unsigned ParamsToSkip = 0, - EvaluationOrder Order = EvaluationOrder::Default) { - SmallVector<QualType, 16> ArgTypes; - CallExpr::const_arg_iterator Arg = ArgRange.begin(); - - assert((ParamsToSkip == 0 || CallArgTypeInfo) && - "Can't skip parameters if type info is not provided"); - if (CallArgTypeInfo) { -#ifndef NDEBUG - bool isGenericMethod = isObjCMethodWithTypeParams(CallArgTypeInfo); -#endif - - // First, use the argument types that the type info knows about - for (auto I = CallArgTypeInfo->param_type_begin() + ParamsToSkip, - E = CallArgTypeInfo->param_type_end(); - I != E; ++I, ++Arg) { - assert(Arg != ArgRange.end() && "Running over edge of argument list!"); - assert((isGenericMethod || - ((*I)->isVariablyModifiedType() || - (*I).getNonReferenceType()->isObjCRetainableType() || - getContext() - .getCanonicalType((*I).getNonReferenceType()) - .getTypePtr() == - getContext() - .getCanonicalType((*Arg)->getType()) - .getTypePtr())) && - "type mismatch in call argument!"); - ArgTypes.push_back(*I); - } - } - - // Either we've emitted all the call args, or we have a call to variadic - // function. - assert((Arg == ArgRange.end() || !CallArgTypeInfo || - CallArgTypeInfo->isVariadic()) && - "Extra arguments in non-variadic function!"); - - // If we still have any arguments, emit them using the type of the argument. - for (auto *A : llvm::make_range(Arg, ArgRange.end())) - ArgTypes.push_back(CallArgTypeInfo ? getVarArgType(A) : A->getType()); + // Wrapper for function prototype sources. Wraps either a FunctionProtoType or + // an ObjCMethodDecl. + struct PrototypeWrapper { + llvm::PointerUnion<const FunctionProtoType *, const ObjCMethodDecl *> P; - EmitCallArgs(Args, ArgTypes, ArgRange, AC, ParamsToSkip, Order); - } + PrototypeWrapper(const FunctionProtoType *FT) : P(FT) {} + PrototypeWrapper(const ObjCMethodDecl *MD) : P(MD) {} + }; - void EmitCallArgs(CallArgList &Args, ArrayRef<QualType> ArgTypes, + void EmitCallArgs(CallArgList &Args, PrototypeWrapper Prototype, llvm::iterator_range<CallExpr::const_arg_iterator> ArgRange, AbstractCallee AC = AbstractCallee(), unsigned ParamsToSkip = 0, |