summaryrefslogtreecommitdiffstats
path: root/include/clang/Lex
diff options
context:
space:
mode:
authorSaleem Abdulrasool <compnerd@compnerd.org>2018-04-11 23:47:25 +0000
committerSaleem Abdulrasool <compnerd@compnerd.org>2018-04-11 23:47:25 +0000
commitdba5be425449f20480c8053388d0deb7b99dac51 (patch)
tree9b262d03ba6e2b24ed8f1fa4a27f27a25c6ddc4f /include/clang/Lex
parent7c19d0f700520e6df68573fc867b878a922d6d55 (diff)
Lex: make `clang::Preprocessor::macros` work on MSVC
The order of argument construction is reversed on MS ABI on Windows. When `macros` was invoked, the `end` call is made prior to `begin`. In such a case, the DenseMap (`ModuleMap`) is populated after the `end` iterator is constructed. This reversal results in the invalidation of the end iterator, resulting in a failure at runtime (assertion failure in `DenseMap<T>::operator!=` that "handles are not in sync!"). Ensure that the end iterator is constructed after the begin iterator. This fixes the use of `macros(bool)`, which symptomized as an assertion failure in the swift compiler in the clang importer. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@329866 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/clang/Lex')
-rw-r--r--include/clang/Lex/Preprocessor.h8
1 files changed, 5 insertions, 3 deletions
diff --git a/include/clang/Lex/Preprocessor.h b/include/clang/Lex/Preprocessor.h
index 485600f122..630b87ced3 100644
--- a/include/clang/Lex/Preprocessor.h
+++ b/include/clang/Lex/Preprocessor.h
@@ -1041,12 +1041,14 @@ public:
macro_iterator macro_begin(bool IncludeExternalMacros = true) const;
macro_iterator macro_end(bool IncludeExternalMacros = true) const;
- llvm::iterator_range<macro_iterator>
+ llvm::iterator_range<macro_iterator>
macros(bool IncludeExternalMacros = true) const {
- return llvm::make_range(macro_begin(IncludeExternalMacros),
- macro_end(IncludeExternalMacros));
+ macro_iterator begin = macro_begin(IncludeExternalMacros);
+ macro_iterator end = macro_end(IncludeExternalMacros);
+ return llvm::make_range(begin, end);
}
+
/// \}
/// \brief Return the name of the macro defined before \p Loc that has