void TrailingReturnCheck::registerMatchers(MatchFinder *Finder) { // Requires C++11 or later. if (!getLangOpts().CPlusPlus11) return; // Functions that have trailing returns are disallowed, except for those // using decltype specifiers and lambda with otherwise unutterable // return types. Finder->addMatcher( functionDecl(allOf(hasTrailingReturn(), unless(anyOf(returns(decltypeType()), hasParent(cxxRecordDecl(isLambda())))))) .bind("decl"), this); }
void AvoidConstParamsInDecls::registerMatchers(MatchFinder *Finder) { const auto ConstParamDecl = parmVarDecl(hasType(qualType(isConstQualified()))).bind("param"); Finder->addMatcher( functionDecl(unless(isDefinition()), // Lambdas are always their own definition, but they // generate a non-definition FunctionDecl too. Ignore those. // Class template instantiations have a non-definition // CXXMethodDecl for methods that aren't used in this // translation unit. Ignore those, as the template will have // already been checked. unless(cxxMethodDecl(ofClass(cxxRecordDecl(anyOf( isLambda(), ast_matchers::isTemplateInstantiation()))))), has(typeLoc(forEach(ConstParamDecl)))) .bind("func"), this); }
void StaticObjectExceptionCheck::registerMatchers(MatchFinder *Finder) { if ((!getLangOpts().CPlusPlus) || (!getLangOpts().CXXExceptions)) return; // Match any static or thread_local variable declaration that has an // initializer that can throw. Finder->addMatcher( varDecl(anyOf(hasThreadStorageDuration(), hasStaticStorageDuration()), unless(anyOf(isConstexpr(), hasType(cxxRecordDecl(isLambda())), hasAncestor(functionDecl()))), anyOf(hasDescendant(cxxConstructExpr(hasDeclaration( cxxConstructorDecl(unless(isNoThrow())).bind("func")))), hasDescendant(cxxNewExpr(hasDeclaration( functionDecl(unless(isNoThrow())).bind("func")))), hasDescendant(callExpr(hasDeclaration( functionDecl(unless(isNoThrow())).bind("func")))))) .bind("var"), this); }
int Describe(char* str, int len, Object* object){ if( isNil(object) ) return DescribeNil(str, len, object); if( isConsCell(object) ) return DescribeConsCell(str, len, object); if( isSymbol(object) ) return DescribeSymbol(str, len, object); if( isInteger(object) ) return DescribeInteger(str, len, object); if( isLambda(object) ) return DescribeLambda(str, len, object); if( isPrimitiveFunc(object) ) return DescribePrimitiveFunc(str, len, object); if( isContinuation(object) ) return DescribeContinuation(str, len, object); if( isEnvironment(object) ) return DescribeEnvironment(str, len, object); if( isBool(object) ) return DescribeBool(str, len, object); if( isSpecialForm(object) ) return DescribeSpecialForm(str, len, object); if( isCondition(object) ) return DescribeCondition(str, len, object); if( isCharacter(object) ) return DescribeCharacter(str, len, object); else return DescribeUnknown(str, len, object); }
int Inspect(char* str, int len, Object* object){ if( isNil(object) ) return InspectNil(str, len, object); if( isConsCell(object) ) return InspectConsCell(str, len, object); if( isSymbol(object) ) return InspectSymbol(str, len, object); if( isInteger(object) ) return InspectInteger(str, len, object); if( isLambda(object) ) return InspectLambda(str, len, object); if( isPrimitiveFunc(object) ) return InspectPrimitiveFunc(str, len, object); if( isContinuation(object) ) return InspectContinuation(str, len, object); if( isEnvironment(object) ) return InspectEnvironment(str, len, object); if( isBool(object) ) return InspectBool(str, len, object); if( isSpecialForm(object) ) return InspectSpecialForm(str, len, object); if( isCondition(object) ) return InspectCondition(str, len, object); if( isCharacter(object) ) return InspectCharacter(str, len, object); else return InspectUnknown(str, len, object); }
value caml_isLambda(value e) { CAMLparam1(e); CAMLreturn(Val_int(isLambda(Expr_val(e)))); }