1//===--- ASTLambda.h - Lambda Helper Functions --------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9/// 10/// \file 11/// \brief This file provides some common utility functions for processing 12/// Lambda related AST Constructs. 13/// 14//===----------------------------------------------------------------------===// 15 16#ifndef LLVM_CLANG_AST_LAMBDA_H 17#define LLVM_CLANG_AST_LAMBDA_H 18 19#include "clang/AST/DeclCXX.h" 20#include "clang/AST/DeclTemplate.h" 21 22namespace clang { 23inline StringRef getLambdaStaticInvokerName() { 24 return "__invoke"; 25} 26// This function returns true if M is a specialization, a template, 27// or a non-generic lambda call operator. 28inline bool isLambdaCallOperator(const CXXMethodDecl *MD) { 29 const CXXRecordDecl *LambdaClass = MD->getParent(); 30 if (!LambdaClass || !LambdaClass->isLambda()) return false; 31 return MD->getOverloadedOperator() == OO_Call; 32} 33 34inline bool isLambdaCallOperator(const DeclContext *DC) { 35 if (!DC || !isa<CXXMethodDecl>(DC)) return false; 36 return isLambdaCallOperator(cast<CXXMethodDecl>(DC)); 37} 38 39inline bool isGenericLambdaCallOperatorSpecialization(const CXXMethodDecl *MD) { 40 if (!MD) return false; 41 const CXXRecordDecl *LambdaClass = MD->getParent(); 42 if (LambdaClass && LambdaClass->isGenericLambda()) 43 return isLambdaCallOperator(MD) && 44 MD->isFunctionTemplateSpecialization(); 45 return false; 46} 47 48inline bool isLambdaConversionOperator(CXXConversionDecl *C) { 49 return C ? C->getParent()->isLambda() : false; 50} 51 52inline bool isLambdaConversionOperator(Decl *D) { 53 if (!D) return false; 54 if (CXXConversionDecl *Conv = dyn_cast<CXXConversionDecl>(D)) 55 return isLambdaConversionOperator(Conv); 56 if (FunctionTemplateDecl *F = dyn_cast<FunctionTemplateDecl>(D)) 57 if (CXXConversionDecl *Conv = 58 dyn_cast_or_null<CXXConversionDecl>(F->getTemplatedDecl())) 59 return isLambdaConversionOperator(Conv); 60 return false; 61} 62 63inline bool isGenericLambdaCallOperatorSpecialization(DeclContext *DC) { 64 return isGenericLambdaCallOperatorSpecialization( 65 dyn_cast<CXXMethodDecl>(DC)); 66} 67 68 69// This returns the parent DeclContext ensuring that the correct 70// parent DeclContext is returned for Lambdas 71inline DeclContext *getLambdaAwareParentOfDeclContext(DeclContext *DC) { 72 if (isLambdaCallOperator(DC)) 73 return DC->getParent()->getParent(); 74 else 75 return DC->getParent(); 76} 77 78} // clang 79 80#endif // LLVM_CLANG_AST_LAMBDA_H 81