diff options
Diffstat (limited to 'lib/Index')
-rw-r--r-- | lib/Index/CMakeLists.txt | 1 | ||||
-rw-r--r-- | lib/Index/IndexDecl.cpp | 11 | ||||
-rw-r--r-- | lib/Index/IndexSymbol.cpp | 12 | ||||
-rw-r--r-- | lib/Index/IndexTypeSourceInfo.cpp | 2 | ||||
-rw-r--r-- | lib/Index/IndexingAction.cpp | 159 | ||||
-rw-r--r-- | lib/Index/IndexingContext.cpp | 57 | ||||
-rw-r--r-- | lib/Index/IndexingContext.h | 15 | ||||
-rw-r--r-- | lib/Index/SimpleFormatContext.h | 4 | ||||
-rw-r--r-- | lib/Index/USRGeneration.cpp | 30 |
9 files changed, 203 insertions, 88 deletions
diff --git a/lib/Index/CMakeLists.txt b/lib/Index/CMakeLists.txt index c9fbfafcf9460..1362143fb0d45 100644 --- a/lib/Index/CMakeLists.txt +++ b/lib/Index/CMakeLists.txt @@ -23,6 +23,7 @@ add_clang_library(clangIndex clangBasic clangFormat clangFrontend + clangLex clangRewrite clangSerialization clangToolingCore diff --git a/lib/Index/IndexDecl.cpp b/lib/Index/IndexDecl.cpp index e14750e046eb9..01ad3a2772167 100644 --- a/lib/Index/IndexDecl.cpp +++ b/lib/Index/IndexDecl.cpp @@ -43,7 +43,7 @@ public: return true; } - /// \brief Returns true if the given method has been defined explicitly by the + /// Returns true if the given method has been defined explicitly by the /// user. static bool hasUserDefined(const ObjCMethodDecl *D, const ObjCImplDecl *Container) { @@ -664,8 +664,11 @@ public: bool VisitTemplateDecl(const TemplateDecl *D) { - // Index the default values for the template parameters. const NamedDecl *Parent = D->getTemplatedDecl(); + if (!Parent) + return true; + + // Index the default values for the template parameters. if (D->getTemplateParameters() && shouldIndexTemplateParameterDefaultValue(Parent)) { const TemplateParameterList *Params = D->getTemplateParameters(); @@ -684,7 +687,7 @@ public: } } - return Visit(D->getTemplatedDecl()); + return Visit(Parent); } bool VisitFriendDecl(const FriendDecl *D) { @@ -723,7 +726,7 @@ bool IndexingContext::indexDecl(const Decl *D) { if (D->isImplicit() && shouldIgnoreIfImplicit(D)) return true; - if (isTemplateImplicitInstantiation(D)) + if (isTemplateImplicitInstantiation(D) && !shouldIndexImplicitInstantiation()) return true; IndexingDeclVisitor Visitor(*this); diff --git a/lib/Index/IndexSymbol.cpp b/lib/Index/IndexSymbol.cpp index 733d4dbc2f944..03b55ffe8a4ec 100644 --- a/lib/Index/IndexSymbol.cpp +++ b/lib/Index/IndexSymbol.cpp @@ -12,6 +12,7 @@ #include "clang/AST/DeclObjC.h" #include "clang/AST/DeclTemplate.h" #include "clang/AST/PrettyPrinter.h" +#include "clang/Lex/MacroInfo.h" using namespace clang; using namespace clang::index; @@ -348,6 +349,15 @@ SymbolInfo index::getSymbolInfo(const Decl *D) { return Info; } +SymbolInfo index::getSymbolInfoForMacro(const MacroInfo &) { + SymbolInfo Info; + Info.Kind = SymbolKind::Macro; + Info.SubKind = SymbolSubKind::None; + Info.Properties = SymbolPropertySet(); + Info.Lang = SymbolLanguage::C; + return Info; +} + bool index::applyForEachSymbolRoleInterruptible(SymbolRoleSet Roles, llvm::function_ref<bool(SymbolRole)> Fn) { #define APPLY_FOR_ROLE(Role) \ @@ -364,6 +374,7 @@ bool index::applyForEachSymbolRoleInterruptible(SymbolRoleSet Roles, APPLY_FOR_ROLE(Dynamic); APPLY_FOR_ROLE(AddressOf); APPLY_FOR_ROLE(Implicit); + APPLY_FOR_ROLE(Undefinition); APPLY_FOR_ROLE(RelationChildOf); APPLY_FOR_ROLE(RelationBaseOf); APPLY_FOR_ROLE(RelationOverrideOf); @@ -405,6 +416,7 @@ void index::printSymbolRoles(SymbolRoleSet Roles, raw_ostream &OS) { case SymbolRole::Dynamic: OS << "Dyn"; break; case SymbolRole::AddressOf: OS << "Addr"; break; case SymbolRole::Implicit: OS << "Impl"; break; + case SymbolRole::Undefinition: OS << "Undef"; break; case SymbolRole::RelationChildOf: OS << "RelChild"; break; case SymbolRole::RelationBaseOf: OS << "RelBase"; break; case SymbolRole::RelationOverrideOf: OS << "RelOver"; break; diff --git a/lib/Index/IndexTypeSourceInfo.cpp b/lib/Index/IndexTypeSourceInfo.cpp index c8ff3d72d4be1..7a7a156478f88 100644 --- a/lib/Index/IndexTypeSourceInfo.cpp +++ b/lib/Index/IndexTypeSourceInfo.cpp @@ -129,7 +129,7 @@ public: template<typename TypeLocType> bool HandleTemplateSpecializationTypeLoc(TypeLocType TL) { if (const auto *T = TL.getTypePtr()) { - if (IndexCtx.shouldIndexImplicitTemplateInsts()) { + if (IndexCtx.shouldIndexImplicitInstantiation()) { if (CXXRecordDecl *RD = T->getAsCXXRecordDecl()) IndexCtx.handleReference(RD, TL.getTemplateNameLoc(), Parent, ParentDC, SymbolRoleSet(), Relations); diff --git a/lib/Index/IndexingAction.cpp b/lib/Index/IndexingAction.cpp index 411657bf3dcdd..16f6c21745ef4 100644 --- a/lib/Index/IndexingAction.cpp +++ b/lib/Index/IndexingAction.cpp @@ -13,30 +13,32 @@ #include "clang/Frontend/FrontendAction.h" #include "clang/Frontend/MultiplexConsumer.h" #include "clang/Index/IndexDataConsumer.h" +#include "clang/Lex/PPCallbacks.h" #include "clang/Lex/Preprocessor.h" #include "clang/Serialization/ASTReader.h" +#include "llvm/ADT/STLExtras.h" +#include <memory> using namespace clang; using namespace clang::index; -void IndexDataConsumer::_anchor() {} - bool IndexDataConsumer::handleDeclOccurence(const Decl *D, SymbolRoleSet Roles, ArrayRef<SymbolRelation> Relations, - FileID FID, unsigned Offset, + SourceLocation Loc, ASTNodeInfo ASTNode) { return true; } bool IndexDataConsumer::handleMacroOccurence(const IdentifierInfo *Name, - const MacroInfo *MI, SymbolRoleSet Roles, - FileID FID, unsigned Offset) { + const MacroInfo *MI, + SymbolRoleSet Roles, + SourceLocation Loc) { return true; } bool IndexDataConsumer::handleModuleOccurence(const ImportDecl *ImportD, SymbolRoleSet Roles, - FileID FID, unsigned Offset) { + SourceLocation Loc) { return true; } @@ -44,21 +46,22 @@ namespace { class IndexASTConsumer : public ASTConsumer { std::shared_ptr<Preprocessor> PP; - IndexingContext &IndexCtx; + std::shared_ptr<IndexingContext> IndexCtx; public: - IndexASTConsumer(std::shared_ptr<Preprocessor> PP, IndexingContext &IndexCtx) - : PP(std::move(PP)), IndexCtx(IndexCtx) {} + IndexASTConsumer(std::shared_ptr<Preprocessor> PP, + std::shared_ptr<IndexingContext> IndexCtx) + : PP(std::move(PP)), IndexCtx(std::move(IndexCtx)) {} protected: void Initialize(ASTContext &Context) override { - IndexCtx.setASTContext(Context); - IndexCtx.getDataConsumer().initialize(Context); - IndexCtx.getDataConsumer().setPreprocessor(PP); + IndexCtx->setASTContext(Context); + IndexCtx->getDataConsumer().initialize(Context); + IndexCtx->getDataConsumer().setPreprocessor(PP); } bool HandleTopLevelDecl(DeclGroupRef DG) override { - return IndexCtx.indexDeclGroupRef(DG); + return IndexCtx->indexDeclGroupRef(DG); } void HandleInterestingDecl(DeclGroupRef DG) override { @@ -66,22 +69,52 @@ protected: } void HandleTopLevelDeclInObjCContainer(DeclGroupRef DG) override { - IndexCtx.indexDeclGroupRef(DG); + IndexCtx->indexDeclGroupRef(DG); } void HandleTranslationUnit(ASTContext &Ctx) override { } }; +class IndexPPCallbacks : public PPCallbacks { + std::shared_ptr<IndexingContext> IndexCtx; + +public: + IndexPPCallbacks(std::shared_ptr<IndexingContext> IndexCtx) + : IndexCtx(std::move(IndexCtx)) {} + + void MacroExpands(const Token &MacroNameTok, const MacroDefinition &MD, + SourceRange Range, const MacroArgs *Args) override { + IndexCtx->handleMacroReference(*MacroNameTok.getIdentifierInfo(), + Range.getBegin(), *MD.getMacroInfo()); + } + + void MacroDefined(const Token &MacroNameTok, + const MacroDirective *MD) override { + IndexCtx->handleMacroDefined(*MacroNameTok.getIdentifierInfo(), + MacroNameTok.getLocation(), + *MD->getMacroInfo()); + } + + void MacroUndefined(const Token &MacroNameTok, const MacroDefinition &MD, + const MacroDirective *Undef) override { + if (!MD.getMacroInfo()) // Ignore noop #undef. + return; + IndexCtx->handleMacroUndefined(*MacroNameTok.getIdentifierInfo(), + MacroNameTok.getLocation(), + *MD.getMacroInfo()); + } +}; + class IndexActionBase { protected: std::shared_ptr<IndexDataConsumer> DataConsumer; - IndexingContext IndexCtx; + std::shared_ptr<IndexingContext> IndexCtx; IndexActionBase(std::shared_ptr<IndexDataConsumer> dataConsumer, IndexingOptions Opts) - : DataConsumer(std::move(dataConsumer)), - IndexCtx(Opts, *DataConsumer) {} + : DataConsumer(std::move(dataConsumer)), + IndexCtx(new IndexingContext(Opts, *DataConsumer)) {} std::unique_ptr<IndexASTConsumer> createIndexASTConsumer(CompilerInstance &CI) { @@ -89,6 +122,10 @@ protected: IndexCtx); } + std::unique_ptr<PPCallbacks> createIndexPPCallbacks() { + return llvm::make_unique<IndexPPCallbacks>(IndexCtx); + } + void finish() { DataConsumer->finish(); } @@ -106,6 +143,11 @@ protected: return createIndexASTConsumer(CI); } + bool BeginSourceFileAction(clang::CompilerInstance &CI) override { + CI.getPreprocessor().addPPCallbacks(createIndexPPCallbacks()); + return true; + } + void EndSourceFileAction() override { FrontendAction::EndSourceFileAction(); finish(); @@ -124,32 +166,34 @@ public: protected: std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI, - StringRef InFile) override; - void EndSourceFileAction() override; -}; - -} // anonymous namespace + StringRef InFile) override { + auto OtherConsumer = WrapperFrontendAction::CreateASTConsumer(CI, InFile); + if (!OtherConsumer) { + IndexActionFailed = true; + return nullptr; + } + + std::vector<std::unique_ptr<ASTConsumer>> Consumers; + Consumers.push_back(std::move(OtherConsumer)); + Consumers.push_back(createIndexASTConsumer(CI)); + return llvm::make_unique<MultiplexConsumer>(std::move(Consumers)); + } -void WrappingIndexAction::EndSourceFileAction() { - // Invoke wrapped action's method. - WrapperFrontendAction::EndSourceFileAction(); - if (!IndexActionFailed) - finish(); -} + bool BeginSourceFileAction(clang::CompilerInstance &CI) override { + WrapperFrontendAction::BeginSourceFileAction(CI); + CI.getPreprocessor().addPPCallbacks(createIndexPPCallbacks()); + return true; + } -std::unique_ptr<ASTConsumer> -WrappingIndexAction::CreateASTConsumer(CompilerInstance &CI, StringRef InFile) { - auto OtherConsumer = WrapperFrontendAction::CreateASTConsumer(CI, InFile); - if (!OtherConsumer) { - IndexActionFailed = true; - return nullptr; + void EndSourceFileAction() override { + // Invoke wrapped action's method. + WrapperFrontendAction::EndSourceFileAction(); + if (!IndexActionFailed) + finish(); } +}; - std::vector<std::unique_ptr<ASTConsumer>> Consumers; - Consumers.push_back(std::move(OtherConsumer)); - Consumers.push_back(createIndexASTConsumer(CI)); - return llvm::make_unique<MultiplexConsumer>(std::move(Consumers)); -} +} // anonymous namespace std::unique_ptr<FrontendAction> index::createIndexingAction(std::shared_ptr<IndexDataConsumer> DataConsumer, @@ -162,7 +206,6 @@ index::createIndexingAction(std::shared_ptr<IndexDataConsumer> DataConsumer, return llvm::make_unique<IndexAction>(std::move(DataConsumer), Opts); } - static bool topLevelDeclVisitor(void *context, const Decl *D) { IndexingContext &IndexCtx = *static_cast<IndexingContext*>(context); return IndexCtx.indexTopLevelDecl(D); @@ -172,40 +215,44 @@ static void indexTranslationUnit(ASTUnit &Unit, IndexingContext &IndexCtx) { Unit.visitLocalTopLevelDecls(&IndexCtx, topLevelDeclVisitor); } -void index::indexASTUnit(ASTUnit &Unit, - std::shared_ptr<IndexDataConsumer> DataConsumer, +void index::indexASTUnit(ASTUnit &Unit, IndexDataConsumer &DataConsumer, IndexingOptions Opts) { - IndexingContext IndexCtx(Opts, *DataConsumer); + IndexingContext IndexCtx(Opts, DataConsumer); IndexCtx.setASTContext(Unit.getASTContext()); - DataConsumer->initialize(Unit.getASTContext()); - DataConsumer->setPreprocessor(Unit.getPreprocessorPtr()); + DataConsumer.initialize(Unit.getASTContext()); + DataConsumer.setPreprocessor(Unit.getPreprocessorPtr()); indexTranslationUnit(Unit, IndexCtx); - DataConsumer->finish(); + DataConsumer.finish(); } void index::indexTopLevelDecls(ASTContext &Ctx, ArrayRef<const Decl *> Decls, - std::shared_ptr<IndexDataConsumer> DataConsumer, + IndexDataConsumer &DataConsumer, IndexingOptions Opts) { - IndexingContext IndexCtx(Opts, *DataConsumer); + IndexingContext IndexCtx(Opts, DataConsumer); IndexCtx.setASTContext(Ctx); - DataConsumer->initialize(Ctx); + DataConsumer.initialize(Ctx); for (const Decl *D : Decls) IndexCtx.indexTopLevelDecl(D); - DataConsumer->finish(); + DataConsumer.finish(); +} + +std::unique_ptr<PPCallbacks> +index::indexMacrosCallback(IndexDataConsumer &Consumer, IndexingOptions Opts) { + return llvm::make_unique<IndexPPCallbacks>( + std::make_shared<IndexingContext>(Opts, Consumer)); } -void index::indexModuleFile(serialization::ModuleFile &Mod, - ASTReader &Reader, - std::shared_ptr<IndexDataConsumer> DataConsumer, +void index::indexModuleFile(serialization::ModuleFile &Mod, ASTReader &Reader, + IndexDataConsumer &DataConsumer, IndexingOptions Opts) { ASTContext &Ctx = Reader.getContext(); - IndexingContext IndexCtx(Opts, *DataConsumer); + IndexingContext IndexCtx(Opts, DataConsumer); IndexCtx.setASTContext(Ctx); - DataConsumer->initialize(Ctx); + DataConsumer.initialize(Ctx); for (const Decl *D : Reader.getModuleFileLevelDecls(Mod)) { IndexCtx.indexTopLevelDecl(D); } - DataConsumer->finish(); + DataConsumer.finish(); } diff --git a/lib/Index/IndexingContext.cpp b/lib/Index/IndexingContext.cpp index de9fe39df0310..80d851b43d732 100644 --- a/lib/Index/IndexingContext.cpp +++ b/lib/Index/IndexingContext.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// #include "IndexingContext.h" +#include "clang/Basic/SourceLocation.h" #include "clang/Index/IndexDataConsumer.h" #include "clang/AST/ASTContext.h" #include "clang/AST/DeclTemplate.h" @@ -36,6 +37,10 @@ bool IndexingContext::shouldIndexFunctionLocalSymbols() const { return IndexOpts.IndexFunctionLocals; } +bool IndexingContext::shouldIndexImplicitInstantiation() const { + return IndexOpts.IndexImplicitInstantiation; +} + bool IndexingContext::handleDecl(const Decl *D, SymbolRoleSet Roles, ArrayRef<SymbolRelation> Relations) { @@ -82,14 +87,9 @@ bool IndexingContext::importedModule(const ImportDecl *ImportD) { Loc = IdLocs.front(); else Loc = ImportD->getLocation(); - SourceManager &SM = Ctx->getSourceManager(); - Loc = SM.getFileLoc(Loc); - if (Loc.isInvalid()) - return true; - FileID FID; - unsigned Offset; - std::tie(FID, Offset) = SM.getDecomposedLoc(Loc); + SourceManager &SM = Ctx->getSourceManager(); + FileID FID = SM.getFileID(SM.getFileLoc(Loc)); if (FID.isInvalid()) return true; @@ -112,7 +112,7 @@ bool IndexingContext::importedModule(const ImportDecl *ImportD) { if (ImportD->isImplicit()) Roles |= (unsigned)SymbolRole::Implicit; - return DataConsumer.handleModuleOccurence(ImportD, Roles, FID, Offset); + return DataConsumer.handleModuleOccurence(ImportD, Roles, Loc); } bool IndexingContext::isTemplateImplicitInstantiation(const Decl *D) { @@ -295,6 +295,7 @@ static bool shouldReportOccurrenceForSystemDeclOnlyMode( case SymbolRole::Dynamic: case SymbolRole::AddressOf: case SymbolRole::Implicit: + case SymbolRole::Undefinition: case SymbolRole::RelationReceivedBy: case SymbolRole::RelationCalledBy: case SymbolRole::RelationContainedBy: @@ -327,13 +328,7 @@ bool IndexingContext::handleDeclOccurrence(const Decl *D, SourceLocation Loc, return true; SourceManager &SM = Ctx->getSourceManager(); - Loc = SM.getFileLoc(Loc); - if (Loc.isInvalid()) - return true; - - FileID FID; - unsigned Offset; - std::tie(FID, Offset) = SM.getDecomposedLoc(Loc); + FileID FID = SM.getFileID(SM.getFileLoc(Loc)); if (FID.isInvalid()) return true; @@ -355,6 +350,9 @@ bool IndexingContext::handleDeclOccurrence(const Decl *D, SourceLocation Loc, } } + if (!OrigD) + OrigD = D; + if (isTemplateImplicitInstantiation(D)) { if (!IsRef) return true; @@ -364,9 +362,6 @@ bool IndexingContext::handleDeclOccurrence(const Decl *D, SourceLocation Loc, assert(!isTemplateImplicitInstantiation(D)); } - if (!OrigD) - OrigD = D; - if (IsRef) Roles |= (unsigned)SymbolRole::Reference; else if (isDeclADefinition(OrigD, ContainerDC, *Ctx)) @@ -414,7 +409,27 @@ bool IndexingContext::handleDeclOccurrence(const Decl *D, SourceLocation Loc, Rel.RelatedSymbol->getCanonicalDecl())); } - IndexDataConsumer::ASTNodeInfo Node{ OrigE, OrigD, Parent, ContainerDC }; - return DataConsumer.handleDeclOccurence(D, Roles, FinalRelations, FID, Offset, - Node); + IndexDataConsumer::ASTNodeInfo Node{OrigE, OrigD, Parent, ContainerDC}; + return DataConsumer.handleDeclOccurence(D, Roles, FinalRelations, Loc, Node); +} + +void IndexingContext::handleMacroDefined(const IdentifierInfo &Name, + SourceLocation Loc, + const MacroInfo &MI) { + SymbolRoleSet Roles = (unsigned)SymbolRole::Definition; + DataConsumer.handleMacroOccurence(&Name, &MI, Roles, Loc); +} + +void IndexingContext::handleMacroUndefined(const IdentifierInfo &Name, + SourceLocation Loc, + const MacroInfo &MI) { + SymbolRoleSet Roles = (unsigned)SymbolRole::Undefinition; + DataConsumer.handleMacroOccurence(&Name, &MI, Roles, Loc); +} + +void IndexingContext::handleMacroReference(const IdentifierInfo &Name, + SourceLocation Loc, + const MacroInfo &MI) { + SymbolRoleSet Roles = (unsigned)SymbolRole::Reference; + DataConsumer.handleMacroOccurence(&Name, &MI, Roles, Loc); } diff --git a/lib/Index/IndexingContext.h b/lib/Index/IndexingContext.h index 566651c83a75f..04960086d0928 100644 --- a/lib/Index/IndexingContext.h +++ b/lib/Index/IndexingContext.h @@ -10,9 +10,11 @@ #ifndef LLVM_CLANG_LIB_INDEX_INDEXINGCONTEXT_H #define LLVM_CLANG_LIB_INDEX_INDEXINGCONTEXT_H +#include "clang/Basic/IdentifierTable.h" #include "clang/Basic/LLVM.h" #include "clang/Index/IndexSymbol.h" #include "clang/Index/IndexingAction.h" +#include "clang/Lex/MacroInfo.h" #include "llvm/ADT/ArrayRef.h" namespace clang { @@ -58,9 +60,7 @@ public: bool shouldIndexFunctionLocalSymbols() const; - bool shouldIndexImplicitTemplateInsts() const { - return false; - } + bool shouldIndexImplicitInstantiation() const; static bool isTemplateImplicitInstantiation(const Decl *D); @@ -80,6 +80,15 @@ public: const Expr *RefE = nullptr, const Decl *RefD = nullptr); + void handleMacroDefined(const IdentifierInfo &Name, SourceLocation Loc, + const MacroInfo &MI); + + void handleMacroUndefined(const IdentifierInfo &Name, SourceLocation Loc, + const MacroInfo &MI); + + void handleMacroReference(const IdentifierInfo &Name, SourceLocation Loc, + const MacroInfo &MD); + bool importedModule(const ImportDecl *ImportD); bool indexDecl(const Decl *D); diff --git a/lib/Index/SimpleFormatContext.h b/lib/Index/SimpleFormatContext.h index 2c26e4d82e081..9c6d29bec329f 100644 --- a/lib/Index/SimpleFormatContext.h +++ b/lib/Index/SimpleFormatContext.h @@ -9,7 +9,7 @@ // /// \file /// -/// \brief Defines a utility class for use of clang-format in libclang +/// Defines a utility class for use of clang-format in libclang // //===----------------------------------------------------------------------===// @@ -29,7 +29,7 @@ namespace clang { namespace index { -/// \brief A small class to be used by libclang clients to format +/// A small class to be used by libclang clients to format /// a declaration string in memory. This object is instantiated once /// and used each time a formatting is needed. class SimpleFormatContext { diff --git a/lib/Index/USRGeneration.cpp b/lib/Index/USRGeneration.cpp index 3a06554b256c6..e69fa749b45f7 100644 --- a/lib/Index/USRGeneration.cpp +++ b/lib/Index/USRGeneration.cpp @@ -103,7 +103,7 @@ public: void VisitUnresolvedUsingTypenameDecl(const UnresolvedUsingTypenameDecl *D); void VisitLinkageSpecDecl(const LinkageSpecDecl *D) { - IgnoreResults = true; + IgnoreResults = true; // No USRs for linkage specs themselves. } void VisitUsingDirectiveDecl(const UsingDirectiveDecl *D) { @@ -192,6 +192,8 @@ bool USRGenerator::ShouldGenerateLocation(const NamedDecl *D) { void USRGenerator::VisitDeclContext(const DeclContext *DC) { if (const NamedDecl *D = dyn_cast<NamedDecl>(DC)) Visit(D); + else if (isa<LinkageSpecDecl>(DC)) // Linkage specs are transparent in USRs. + VisitDeclContext(DC->getParent()); } void USRGenerator::VisitFieldDecl(const FieldDecl *D) { @@ -648,6 +650,8 @@ void USRGenerator::VisitType(QualType T) { c = 'b'; break; case BuiltinType::UChar: c = 'c'; break; + case BuiltinType::Char8: + c = 'u'; break; // FIXME: Check this doesn't collide case BuiltinType::Char16: c = 'q'; break; case BuiltinType::Char32: @@ -705,6 +709,30 @@ void USRGenerator::VisitType(QualType T) { case BuiltinType::OCLQueue: case BuiltinType::OCLReserveID: case BuiltinType::OCLSampler: + case BuiltinType::ShortAccum: + case BuiltinType::Accum: + case BuiltinType::LongAccum: + case BuiltinType::UShortAccum: + case BuiltinType::UAccum: + case BuiltinType::ULongAccum: + case BuiltinType::ShortFract: + case BuiltinType::Fract: + case BuiltinType::LongFract: + case BuiltinType::UShortFract: + case BuiltinType::UFract: + case BuiltinType::ULongFract: + case BuiltinType::SatShortAccum: + case BuiltinType::SatAccum: + case BuiltinType::SatLongAccum: + case BuiltinType::SatUShortAccum: + case BuiltinType::SatUAccum: + case BuiltinType::SatULongAccum: + case BuiltinType::SatShortFract: + case BuiltinType::SatFract: + case BuiltinType::SatLongFract: + case BuiltinType::SatUShortFract: + case BuiltinType::SatUFract: + case BuiltinType::SatULongFract: IgnoreResults = true; return; case BuiltinType::ObjCId: |