diff options
| author | 2019-01-27 16:42:12 +0000 | |
|---|---|---|
| committer | 2019-01-27 16:42:12 +0000 | |
| commit | b773203fb58f3ef282fb69c832d8710cab5bc82d (patch) | |
| tree | e75913f147570fbd75169647b144df85b88a038c /gnu/llvm/tools/clang/lib/AST/DeclPrinter.cpp | |
| parent | tweak errno in previous (diff) | |
| download | wireguard-openbsd-b773203fb58f3ef282fb69c832d8710cab5bc82d.tar.xz wireguard-openbsd-b773203fb58f3ef282fb69c832d8710cab5bc82d.zip | |
Import LLVM 7.0.1 release including clang, lld and lldb.
Diffstat (limited to 'gnu/llvm/tools/clang/lib/AST/DeclPrinter.cpp')
| -rw-r--r-- | gnu/llvm/tools/clang/lib/AST/DeclPrinter.cpp | 83 |
1 files changed, 47 insertions, 36 deletions
diff --git a/gnu/llvm/tools/clang/lib/AST/DeclPrinter.cpp b/gnu/llvm/tools/clang/lib/AST/DeclPrinter.cpp index b792c5920a5..55485611054 100644 --- a/gnu/llvm/tools/clang/lib/AST/DeclPrinter.cpp +++ b/gnu/llvm/tools/clang/lib/AST/DeclPrinter.cpp @@ -44,7 +44,7 @@ namespace { /// /// \param Quals The Objective-C declaration qualifiers. /// \param T The type to print. - void PrintObjCMethodType(ASTContext &Ctx, Decl::ObjCDeclQualifier Quals, + void PrintObjCMethodType(ASTContext &Ctx, Decl::ObjCDeclQualifier Quals, QualType T); void PrintObjCTypeParams(ObjCTypeParamList *Params); @@ -128,9 +128,7 @@ static QualType GetBaseType(QualType T) { // FIXME: This should be on the Type class! QualType BaseType = T; while (!BaseType->isSpecifierType()) { - if (isa<TypedefType>(BaseType)) - break; - else if (const PointerType* PTy = BaseType->getAs<PointerType>()) + if (const PointerType *PTy = BaseType->getAs<PointerType>()) BaseType = PTy->getPointeeType(); else if (const BlockPointerType *BPy = BaseType->getAs<BlockPointerType>()) BaseType = BPy->getPointeeType(); @@ -144,8 +142,11 @@ static QualType GetBaseType(QualType T) { BaseType = RTy->getPointeeType(); else if (const AutoType *ATy = BaseType->getAs<AutoType>()) BaseType = ATy->getDeducedType(); + else if (const ParenType *PTy = BaseType->getAs<ParenType>()) + BaseType = PTy->desugar(); else - llvm_unreachable("Unknown declarator!"); + // This must be a syntax error. + break; } return BaseType; } @@ -195,7 +196,7 @@ LLVM_DUMP_METHOD void DeclContext::dumpDeclContext() const { const DeclContext *DC = this; while (!DC->isTranslationUnit()) DC = DC->getParent(); - + ASTContext &Ctx = cast<TranslationUnitDecl>(DC)->getASTContext(); DeclPrinter Printer(llvm::errs(), Ctx.getPrintingPolicy(), Ctx, 0); Printer.VisitDeclContext(const_cast<DeclContext *>(this), /*Indent=*/false); @@ -214,6 +215,8 @@ void DeclPrinter::prettyPrintAttributes(Decl *D) { if (D->hasAttrs()) { AttrVec &Attrs = D->getAttrs(); for (auto *A : Attrs) { + if (A->isInherited() || A->isImplicit()) + continue; switch (A->getKind()) { #define ATTR(X) #define PRAGMA_SPELLING_ATTR(X) case attr::X: @@ -372,21 +375,23 @@ void DeclPrinter::VisitDeclContext(DeclContext *DC, bool Indent) { !isa<ClassTemplateSpecializationDecl>(DC)) continue; - // The next bits of code handles stuff like "struct {int x;} a,b"; we're + // The next bits of code handle stuff like "struct {int x;} a,b"; we're // forced to merge the declarations because there's no other way to - // refer to the struct in question. This limited merging is safe without - // a bunch of other checks because it only merges declarations directly - // referring to the tag, not typedefs. + // refer to the struct in question. When that struct is named instead, we + // also need to merge to avoid splitting off a stand-alone struct + // declaration that produces the warning ext_no_declarators in some + // contexts. + // + // This limited merging is safe without a bunch of other checks because it + // only merges declarations directly referring to the tag, not typedefs. // // Check whether the current declaration should be grouped with a previous - // unnamed struct. + // non-free-standing tag declaration. QualType CurDeclType = getDeclType(*D); if (!Decls.empty() && !CurDeclType.isNull()) { QualType BaseType = GetBaseType(CurDeclType); - if (!BaseType.isNull() && isa<ElaboratedType>(BaseType)) - BaseType = cast<ElaboratedType>(BaseType)->getNamedType(); - if (!BaseType.isNull() && isa<TagType>(BaseType) && - cast<TagType>(BaseType)->getDecl() == Decls[0]) { + if (!BaseType.isNull() && isa<ElaboratedType>(BaseType) && + cast<ElaboratedType>(BaseType)->getOwnedTagDecl() == Decls[0]) { Decls.push_back(*D); continue; } @@ -396,9 +401,9 @@ void DeclPrinter::VisitDeclContext(DeclContext *DC, bool Indent) { if (!Decls.empty()) ProcessDeclGroup(Decls); - // If the current declaration is an unnamed tag type, save it + // If the current declaration is not a free standing declaration, save it // so we can merge it with the subsequent declaration(s) using it. - if (isa<TagDecl>(*D) && !cast<TagDecl>(*D)->getIdentifier()) { + if (isa<TagDecl>(*D) && !cast<TagDecl>(*D)->isFreeStanding()) { Decls.push_back(*D); continue; } @@ -477,7 +482,7 @@ void DeclPrinter::VisitTranslationUnitDecl(TranslationUnitDecl *D) { void DeclPrinter::VisitTypedefDecl(TypedefDecl *D) { if (!Policy.SuppressSpecifiers) { Out << "typedef "; - + if (D->isModulePrivate()) Out << "__module_private__ "; } @@ -495,14 +500,17 @@ void DeclPrinter::VisitTypeAliasDecl(TypeAliasDecl *D) { void DeclPrinter::VisitEnumDecl(EnumDecl *D) { if (!Policy.SuppressSpecifiers && D->isModulePrivate()) Out << "__module_private__ "; - Out << "enum "; + Out << "enum"; if (D->isScoped()) { if (D->isScopedUsingClassTag()) - Out << "class "; + Out << " class"; else - Out << "struct "; + Out << " struct"; } - Out << *D; + + prettyPrintAttributes(D); + + Out << ' ' << *D; if (D->isFixed() && D->getASTContext().getLangOpts().CPlusPlus11) Out << " : " << D->getIntegerType().stream(Policy); @@ -512,7 +520,6 @@ void DeclPrinter::VisitEnumDecl(EnumDecl *D) { VisitDeclContext(D); Indent() << "}"; } - prettyPrintAttributes(D); } void DeclPrinter::VisitRecordDecl(RecordDecl *D) { @@ -634,7 +641,7 @@ void DeclPrinter::VisitFunctionDecl(FunctionDecl *D) { } Proto += ")"; - + if (FT) { if (FT->isConst()) Proto += " const"; @@ -659,7 +666,7 @@ void DeclPrinter::VisitFunctionDecl(FunctionDecl *D) { Proto += " throw("; if (FT->getExceptionSpecType() == EST_MSAny) Proto += "..."; - else + else for (unsigned I = 0, N = FT->getNumExceptions(); I != N; ++I) { if (I) Proto += ", "; @@ -669,7 +676,7 @@ void DeclPrinter::VisitFunctionDecl(FunctionDecl *D) { Proto += ")"; } else if (FT && isNoexceptExceptionSpec(FT->getExceptionSpecType())) { Proto += " noexcept"; - if (FT->getExceptionSpecType() == EST_ComputedNoexcept) { + if (isComputedNoexcept(FT->getExceptionSpecType())) { Proto += "("; llvm::raw_string_ostream EOut(Proto); FT->getNoexceptExpr()->printPretty(EOut, nullptr, SubPolicy, @@ -1084,6 +1091,10 @@ void DeclPrinter::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) { printTemplateParameters(FD->getTemplateParameterList(I)); } VisitRedeclarableTemplateDecl(D); + // Declare target attribute is special one, natural spelling for the pragma + // assumes "ending" construct so print it here. + if (D->getTemplatedDecl()->hasAttr<OMPDeclareTargetDeclAttr>()) + Out << "#pragma omp end declare target\n"; // Never print "instantiations" for deduction guides (they don't really // have them). @@ -1134,8 +1145,8 @@ void DeclPrinter::VisitClassTemplatePartialSpecializationDecl( // Objective-C declarations //---------------------------------------------------------------------------- -void DeclPrinter::PrintObjCMethodType(ASTContext &Ctx, - Decl::ObjCDeclQualifier Quals, +void DeclPrinter::PrintObjCMethodType(ASTContext &Ctx, + Decl::ObjCDeclQualifier Quals, QualType T) { Out << '('; if (Quals & Decl::ObjCDeclQualifier::OBJC_TQ_In) @@ -1154,7 +1165,7 @@ void DeclPrinter::PrintObjCMethodType(ASTContext &Ctx, if (auto nullability = AttributedType::stripOuterNullability(T)) Out << getNullabilitySpelling(*nullability, true) << ' '; } - + Out << Ctx.getUnqualifiedObjCPointerType(T).getAsString(Policy); Out << ')'; } @@ -1209,7 +1220,7 @@ void DeclPrinter::VisitObjCMethodDecl(ObjCMethodDecl *OMD) { if (lastPos != 0) Out << " "; Out << name.substr(lastPos, pos - lastPos) << ':'; - PrintObjCMethodType(OMD->getASTContext(), + PrintObjCMethodType(OMD->getASTContext(), PI->getObjCDeclQualifier(), PI->getType()); Out << *PI; @@ -1221,7 +1232,7 @@ void DeclPrinter::VisitObjCMethodDecl(ObjCMethodDecl *OMD) { if (OMD->isVariadic()) Out << ", ..."; - + prettyPrintAttributes(OMD); if (OMD->getBody() && !Policy.TerseOutput) { @@ -1241,7 +1252,7 @@ void DeclPrinter::VisitObjCImplementationDecl(ObjCImplementationDecl *OID) { Out << "@implementation " << I << " : " << *SID; else Out << "@implementation " << I; - + if (OID->ivar_size() > 0) { Out << "{\n"; eolnOut = true; @@ -1283,7 +1294,7 @@ void DeclPrinter::VisitObjCInterfaceDecl(ObjCInterfaceDecl *OID) { if (auto TypeParams = OID->getTypeParamListAsWritten()) { PrintObjCTypeParams(TypeParams); } - + if (SID) Out << " : " << QualType(OID->getSuperClassType(), 0).getAsString(Policy); @@ -1362,7 +1373,7 @@ void DeclPrinter::VisitObjCCategoryDecl(ObjCCategoryDecl *PID) { Indentation -= Policy.Indentation; Out << "}\n"; } - + VisitDeclContext(PID, false); Out << "@end"; @@ -1441,7 +1452,7 @@ void DeclPrinter::VisitObjCPropertyDecl(ObjCPropertyDecl *PDecl) { Out << (first ? ' ' : ',') << "atomic"; first = false; } - + if (PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_nullability) { if (auto nullability = AttributedType::stripOuterNullability(T)) { @@ -1526,7 +1537,7 @@ void DeclPrinter::VisitOMPThreadPrivateDecl(OMPThreadPrivateDecl *D) { E = D->varlist_end(); I != E; ++I) { Out << (I == D->varlist_begin() ? '(' : ','); - NamedDecl *ND = cast<NamedDecl>(cast<DeclRefExpr>(*I)->getDecl()); + NamedDecl *ND = cast<DeclRefExpr>(*I)->getDecl(); ND->printQualifiedName(Out); } Out << ")"; |
