oontvoo created this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits. oontvoo retitled this revision from "Make a distinction between import and pragma-once, and keep tracked of already-included pragma-once files." to "draft ". oontvoo edited the summary of this revision. oontvoo added a reviewer: jyknight.
Make a distinction between import and pragma-once, and keep tracked of already-included pragma-once files. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D75951 Files: clang/include/clang/Lex/HeaderSearch.h clang/lib/Lex/HeaderSearch.cpp Index: clang/lib/Lex/HeaderSearch.cpp =================================================================== --- clang/lib/Lex/HeaderSearch.cpp +++ clang/lib/Lex/HeaderSearch.cpp @@ -1253,8 +1253,6 @@ // Get information about this file. HeaderFileInfo &FileInfo = getFileInfo(File); - // FIXME: this is a workaround for the lack of proper modules-aware support - // for #import / #pragma once auto TryEnterImported = [&]() -> bool { if (!ModulesEnabled) return false; @@ -1300,13 +1298,24 @@ FileInfo.isImport = true; // Has this already been #import'ed or #include'd? + bool try_enter = TryEnterImported(); if (FileInfo.NumIncludes && !TryEnterImported()) return false; } else { - // Otherwise, if this is a #include of a file that was previously #import'd - // or if this is the second #include of a #pragma once file, ignore it. - if (FileInfo.isImport && !TryEnterImported()) + // If the file has #pragma once guard and if it's been included + // then skip it. + if (FileInfo.isPragmaOnce) { + auto &it = included_pragma_files.find(FileEntry); + if (it != included_pragma_files.end() && it->second) { + return false; + } else { + it->second = true; + } + } else if (FileInfo.isImport && !TryEnterImported) { + // Otherwise, if this is a #include of a file that was previously + // #import'd ignore it. return false; + } } // Next, check to see if the file is wrapped with #ifndef guards. If so, and Index: clang/include/clang/Lex/HeaderSearch.h =================================================================== --- clang/include/clang/Lex/HeaderSearch.h +++ clang/include/clang/Lex/HeaderSearch.h @@ -250,6 +250,9 @@ /// Entity used to look up stored header file information. ExternalHeaderFileInfoSource *ExternalSource = nullptr; + // Set of #pragma_once file already seen. + llvm::DenseMap<const FileEntry *, bool> included_pragma_files; + public: HeaderSearch(std::shared_ptr<HeaderSearchOptions> HSOpts, SourceManager &SourceMgr, DiagnosticsEngine &Diags,
Index: clang/lib/Lex/HeaderSearch.cpp =================================================================== --- clang/lib/Lex/HeaderSearch.cpp +++ clang/lib/Lex/HeaderSearch.cpp @@ -1253,8 +1253,6 @@ // Get information about this file. HeaderFileInfo &FileInfo = getFileInfo(File); - // FIXME: this is a workaround for the lack of proper modules-aware support - // for #import / #pragma once auto TryEnterImported = [&]() -> bool { if (!ModulesEnabled) return false; @@ -1300,13 +1298,24 @@ FileInfo.isImport = true; // Has this already been #import'ed or #include'd? + bool try_enter = TryEnterImported(); if (FileInfo.NumIncludes && !TryEnterImported()) return false; } else { - // Otherwise, if this is a #include of a file that was previously #import'd - // or if this is the second #include of a #pragma once file, ignore it. - if (FileInfo.isImport && !TryEnterImported()) + // If the file has #pragma once guard and if it's been included + // then skip it. + if (FileInfo.isPragmaOnce) { + auto &it = included_pragma_files.find(FileEntry); + if (it != included_pragma_files.end() && it->second) { + return false; + } else { + it->second = true; + } + } else if (FileInfo.isImport && !TryEnterImported) { + // Otherwise, if this is a #include of a file that was previously + // #import'd ignore it. return false; + } } // Next, check to see if the file is wrapped with #ifndef guards. If so, and Index: clang/include/clang/Lex/HeaderSearch.h =================================================================== --- clang/include/clang/Lex/HeaderSearch.h +++ clang/include/clang/Lex/HeaderSearch.h @@ -250,6 +250,9 @@ /// Entity used to look up stored header file information. ExternalHeaderFileInfoSource *ExternalSource = nullptr; + // Set of #pragma_once file already seen. + llvm::DenseMap<const FileEntry *, bool> included_pragma_files; + public: HeaderSearch(std::shared_ptr<HeaderSearchOptions> HSOpts, SourceManager &SourceMgr, DiagnosticsEngine &Diags,
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits