本文整理汇总了C++中QualType::getTypePtrOrNull方法的典型用法代码示例。如果您正苦于以下问题:C++ QualType::getTypePtrOrNull方法的具体用法?C++ QualType::getTypePtrOrNull怎么用?C++ QualType::getTypePtrOrNull使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类QualType
的用法示例。
在下文中一共展示了QualType::getTypePtrOrNull方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: expressionIsComplex
bool ReserveCandidates::expressionIsComplex(clang::Expr *expr) const
{
if (!expr)
return false;
vector<CallExpr*> callExprs;
HierarchyUtils::getChilds<CallExpr>(expr, callExprs);
for (CallExpr *callExpr : callExprs) {
if (QtUtils::isJavaIterator(dyn_cast<CXXMemberCallExpr>(callExpr)))
continue;
QualType qt = callExpr->getType();
const Type *t = qt.getTypePtrOrNull();
if (t && (!t->isIntegerType() || t->isBooleanType()))
return true;
}
vector<ArraySubscriptExpr*> subscriptExprs;
HierarchyUtils::getChilds<ArraySubscriptExpr>(expr, subscriptExprs);
if (!subscriptExprs.empty())
return true;
BinaryOperator* binary = dyn_cast<BinaryOperator>(expr);
if (binary && binary->isAssignmentOp()) { // Filter things like for ( ...; ...; next = node->next)
Expr *rhs = binary->getRHS();
if (isa<MemberExpr>(rhs) || (isa<ImplicitCastExpr>(rhs) && dyn_cast_or_null<MemberExpr>(HierarchyUtils::getFirstChildAtDepth(rhs, 1))))
return true;
}
// llvm::errs() << expr->getStmtClassName() << "\n";
return false;
}
示例2: clang_getTypeDeclaration
CXCursor clang_getTypeDeclaration(CXType CT) {
if (CT.kind == CXType_Invalid)
return cxcursor::MakeCXCursorInvalid(CXCursor_NoDeclFound);
QualType T = GetQualType(CT);
const Type *TP = T.getTypePtrOrNull();
if (!TP)
return cxcursor::MakeCXCursorInvalid(CXCursor_NoDeclFound);
Decl *D = nullptr;
try_again:
switch (TP->getTypeClass()) {
case Type::Typedef:
D = cast<TypedefType>(TP)->getDecl();
break;
case Type::ObjCObject:
D = cast<ObjCObjectType>(TP)->getInterface();
break;
case Type::ObjCInterface:
D = cast<ObjCInterfaceType>(TP)->getDecl();
break;
case Type::Record:
case Type::Enum:
D = cast<TagType>(TP)->getDecl();
break;
case Type::TemplateSpecialization:
if (const RecordType *Record = TP->getAs<RecordType>())
D = Record->getDecl();
else
D = cast<TemplateSpecializationType>(TP)->getTemplateName()
.getAsTemplateDecl();
break;
case Type::Auto:
TP = cast<AutoType>(TP)->getDeducedType().getTypePtrOrNull();
if (TP)
goto try_again;
break;
case Type::InjectedClassName:
D = cast<InjectedClassNameType>(TP)->getDecl();
break;
// FIXME: Template type parameters!
case Type::Elaborated:
TP = cast<ElaboratedType>(TP)->getNamedType().getTypePtrOrNull();
goto try_again;
default:
break;
}
if (!D)
return cxcursor::MakeCXCursorInvalid(CXCursor_NoDeclFound);
return cxcursor::MakeCXCursor(D, GetTU(CT));
}
示例3: clang_getArrayElementType
CXType clang_getArrayElementType(CXType CT) {
QualType ET = QualType();
QualType T = GetQualType(CT);
const Type *TP = T.getTypePtrOrNull();
if (TP) {
switch (TP->getTypeClass()) {
case Type::ConstantArray:
ET = cast<ConstantArrayType> (TP)->getElementType();
break;
case Type::IncompleteArray:
ET = cast<IncompleteArrayType> (TP)->getElementType();
break;
case Type::VariableArray:
ET = cast<VariableArrayType> (TP)->getElementType();
break;
case Type::DependentSizedArray:
ET = cast<DependentSizedArrayType> (TP)->getElementType();
break;
default:
break;
}
}
return MakeCXType(ET, GetTU(CT));
}
示例4: clang_Type_isTransparentTagTypedef
unsigned clang_Type_isTransparentTagTypedef(CXType TT){
QualType T = GetQualType(TT);
if (auto *TT = dyn_cast_or_null<TypedefType>(T.getTypePtrOrNull())) {
if (auto *D = TT->getDecl())
return D->isTransparentTag();
}
return false;
}
示例5:
CXXRecordDecl * Utils::namedCastOuterDecl(CXXNamedCastExpr *staticOrDynamicCast)
{
QualType qt = staticOrDynamicCast->getTypeAsWritten();
const Type *t = qt.getTypePtrOrNull();
QualType qt2 = t->getPointeeType();
const Type *t2 = qt2.getTypePtrOrNull();
if (!t2) return nullptr;
return t2->getAsCXXRecordDecl();
}
示例6: clang_Type_getNamedType
CXType clang_Type_getNamedType(CXType CT){
QualType T = GetQualType(CT);
const Type *TP = T.getTypePtrOrNull();
if (TP && TP->getTypeClass() == Type::Elaborated)
return MakeCXType(cast<ElaboratedType>(TP)->getNamedType(), GetTU(CT));
return MakeCXType(QualType(), GetTU(CT));
}
示例7: clang_isPODType
unsigned clang_isPODType(CXType X) {
QualType T = GetQualType(X);
if (!T.getTypePtrOrNull())
return 0;
CXTranslationUnit TU = GetTU(X);
ASTUnit *AU = static_cast<ASTUnit*>(TU->TUData);
return T.isPODType(AU->getASTContext()) ? 1 : 0;
}
示例8: clang_Type_getClassType
CXType clang_Type_getClassType(CXType CT) {
QualType ET = QualType();
QualType T = GetQualType(CT);
const Type *TP = T.getTypePtrOrNull();
if (TP && TP->getTypeClass() == Type::MemberPointer) {
ET = QualType(cast<MemberPointerType> (TP)->getClass(), 0);
}
return MakeCXType(ET, GetTU(CT));
}
示例9: clang_getResultType
CXType clang_getResultType(CXType X) {
QualType T = GetQualType(X);
if (!T.getTypePtrOrNull())
return MakeCXType(QualType(), GetTU(X));
if (const FunctionType *FD = T->getAs<FunctionType>())
return MakeCXType(FD->getResultType(), GetTU(X));
return MakeCXType(QualType(), GetTU(X));
}
示例10:
ClassTemplateSpecializationDecl *TemplateUtils::templateDecl(Decl *decl)
{
if (isa<ClassTemplateSpecializationDecl>(decl))
return dyn_cast<ClassTemplateSpecializationDecl>(decl);
VarDecl *varDecl = dyn_cast<VarDecl>(decl);
if (!varDecl) return nullptr;
QualType qt = varDecl->getType();
const Type *t = qt.getTypePtrOrNull();
if (!t) return nullptr;
CXXRecordDecl *classDecl = t->getAsCXXRecordDecl();
if (!classDecl) return nullptr;
return dyn_cast<ClassTemplateSpecializationDecl>(classDecl);
}
示例11: VisitStmt
void ImplicitCasts::VisitStmt(clang::Stmt *stmt)
{
auto implicitCast = dyn_cast<ImplicitCastExpr>(stmt);
if (implicitCast == nullptr)
return;
if (implicitCast->getCastKind() == clang::CK_LValueToRValue)
return;
if (implicitCast->getType().getTypePtrOrNull()->isBooleanType())
return;
Expr *expr = implicitCast->getSubExpr();
QualType qt = expr->getType();
if (!qt.getTypePtrOrNull()->isBooleanType()) // Filter out some bool to const bool
return;
Stmt *p = Utils::parent(m_parentMap, stmt);
if (p && isa<BinaryOperator>(p))
return;
if (p && (isa<CStyleCastExpr>(p) || isa<CXXFunctionalCastExpr>(p)))
return;
if (Utils::isInsideOperatorCall(m_parentMap, stmt, {"QTextStream", "QAtomicInt", "QBasicAtomicInt"}))
return;
if (Utils::insideCTORCall(m_parentMap, stmt, {"QAtomicInt", "QBasicAtomicInt"}))
return;
if (Utils::parent(m_parentMap, implicitCast) == nullptr)
return;
StringUtils::printLocation(stmt->getLocStart());
EnumConstantDecl *enumerator = m_lastDecl ? dyn_cast<EnumConstantDecl>(m_lastDecl) : nullptr;
if (enumerator) {
// False positive in Qt headers which generates a lot of noise
return;
}
auto macro = Lexer::getImmediateMacroName(stmt->getLocStart(), m_ci.getSourceManager(), m_ci.getLangOpts());
if (macro == "Q_UNLIKELY" || macro == "Q_LIKELY") {
return;
}
emitWarning(stmt->getLocStart(), "Implicit cast from bool");
}
示例12: VisitDecl
void FunctionArgsByRef::VisitDecl(Decl *decl)
{
FunctionDecl *functionDecl = dyn_cast<FunctionDecl>(decl);
if (functionDecl == nullptr || !functionDecl->hasBody() || shouldIgnoreFunction(functionDecl->getNameAsString())
|| !functionDecl->isThisDeclarationADefinition()) return;
Stmt *body = functionDecl->getBody();
for (auto it = functionDecl->param_begin(), end = functionDecl->param_end(); it != end; ++it) {
const ParmVarDecl *param = *it;
QualType paramQt = param->getType();
const Type *paramType = paramQt.getTypePtrOrNull();
if (paramType == nullptr || paramType->isDependentType())
continue;
const int size_of_T = m_ci.getASTContext().getTypeSize(paramQt) / 8;
const bool isSmall = size_of_T <= 16; // TODO: What about arm ?
CXXRecordDecl *recordDecl = paramType->getAsCXXRecordDecl();
const bool isUserNonTrivial = recordDecl && (recordDecl->hasUserDeclaredCopyConstructor() || recordDecl->hasUserDeclaredDestructor());
const bool isReference = paramType->isLValueReferenceType();
const bool isConst = paramQt.isConstQualified();
if (recordDecl && shouldIgnoreClass(recordDecl->getQualifiedNameAsString()))
continue;
std::string error;
if (isConst && !isReference) {
if (!isSmall) {
error += warningMsgForSmallType(size_of_T, paramQt.getAsString());
} else if (isUserNonTrivial) {
error += "Missing reference on non-trivial type " + recordDecl->getQualifiedNameAsString();
}
} else if (isConst && isReference && !isUserNonTrivial && isSmall) {
//error += "Don't use by-ref on small trivial type";
} else if (!isConst && !isReference && (!isSmall || isUserNonTrivial)) {
if (Utils::containsNonConstMemberCall(body, param) || Utils::containsCallByRef(body, param))
continue;
if (!isSmall) {
error += warningMsgForSmallType(size_of_T, paramQt.getAsString());
} else if (isUserNonTrivial) {
error += "Missing reference on non-trivial type " + recordDecl->getQualifiedNameAsString();
}
}
if (!error.empty()) {
emitWarning(param->getLocStart(), error.c_str());
}
}
}
示例13: registerQTypeInfo
void MissingTypeinfo::registerQTypeInfo(ClassTemplateSpecializationDecl *decl)
{
if (decl->getName() == "QTypeInfo") {
auto &args = decl->getTemplateArgs();
if (args.size() != 1)
return;
QualType qt = args[0].getAsType();
const Type *t = qt.getTypePtrOrNull();
CXXRecordDecl *recordDecl = t ? t->getAsCXXRecordDecl() : nullptr;
// llvm::errs() << qt.getAsString() << " foo\n";
if (recordDecl != nullptr) {
m_typeInfos.insert(recordDecl->getQualifiedNameAsString());
}
}
}
示例14: hasMember
bool Utils::hasMember(CXXRecordDecl *record, const string &memberTypeName)
{
if (!record)
return false;
for (auto field : record->fields()) {
field->getParent()->getNameAsString();
QualType qt = field->getType();
const Type *t = qt.getTypePtrOrNull();
if (t && t->getAsCXXRecordDecl()) {
CXXRecordDecl *rec = t->getAsCXXRecordDecl();
if (rec->getNameAsString() == memberTypeName)
return true;
}
}
return false;
}
示例15: VisitCallExpr
bool HostProgramTuning::VisitCallExpr(CallExpr *E) {
if (E != NULL){
QualType q = E->getType();
const Type *t = q.getTypePtrOrNull();
if(t != NULL)
{
FunctionDecl *func = E->getDirectCallee();
if (!func) return false;
ProcessFuncCall(func->getNameInfo().getName().getAsString(), E);
}
}
return true;
}