Author: compnerd Date: Wed Apr 11 16:47:25 2018 New Revision: 329866 URL: http://llvm.org/viewvc/llvm-project?rev=329866&view=rev Log: 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. Modified: cfe/trunk/include/clang/Lex/Preprocessor.h Modified: cfe/trunk/include/clang/Lex/Preprocessor.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/Preprocessor.h?rev=329866&r1=329865&r2=329866&view=diff ============================================================================== --- cfe/trunk/include/clang/Lex/Preprocessor.h (original) +++ cfe/trunk/include/clang/Lex/Preprocessor.h Wed Apr 11 16:47:25 2018 @@ -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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits