Bug 23307 - clang fails to compile rstudio-0.98.1103/src/cpp/session/modules/SessionHTMLPreview.cpp against libc++

Can one of the libc++ experts take a peak at…

https://llvm.org/bugs/show_bug.cgi?id=23307

I am unclear why clang++ with libstdc++ tolerates the following code from rstudio 0.98.1103…

const char* const MAGIC_GUID = “12861c30b10411e1afa60800200c9a66”;
const char* const FIGURE_DIR = “figure-compile-notebook-12861c30b”;

bool okToGenerateFile(const FilePath& rmdPath,
const std::string& extension,
std::string* pErrMsg)
{
FilePath filePath = rmdPath.parent().complete(
rmdPath.stem() + extension);

if (filePath.exists())
{
boost::shared_ptrstd::istream pStr;
Error error = filePath.open_r(&pStr);
if (error)
{
*pErrMsg = "Error opening file: " + error.summary();
return false;
}

std::string magicGuid(MAGIC_GUID);
std::istreambuf_iterator eod;
if (eod == std::search(std::istreambuf_iterator(*pStr),
eod,
magicGuid.begin(),
magicGuid.end()))

but clang++ with libc++ errors on the above if statement as…

clang++ -DBOOST_ASIO_DISABLE_KQUEUE -DBOOST_ENABLE_ASSERT_HANDLER -DBOOST_SIGNALS_NO_DEPRECATION_WARNING -std=c++11 -stdlib=libc++ -O3 -DNDEBUG -c SessionHTMLPreview.ii

In file included from /sw/src/fink.build/rstudio-desktop-0.98.1103-5/rstudio-0.98.1103/src/cpp/session/modules/SessionHTMLPreview.cpp:17:
In file included from /sw/src/fink.build/rstudio-desktop-0.98.1103-5/rstudio-0.98.1103/src/cpp/session/modules/SessionHTMLPreview.hpp:25:
In file included from /sw/src/fink.build/rstudio-desktop-0.98.1103-5/rstudio-0.98.1103/src/cpp/core/include/core/json/Json.hpp:19:
In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/…/include/c++/v1/string:439:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/…/include/c++/v1/algorithm:1572:12: error: no matching function for call to
‘__search’
return std::__1::__search<typename add_lvalue_reference<_BinaryPredicate>::type>
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/…/include/c++/v1/algorithm:1586:22: note: in instantiation of function
template specialization ‘std::__1::search<std::__1::istreambuf_iterator<char, std::__1::char_traits >, std::__1::__wrap_iter<char *>,
std::__1::__equal_to<char, char> >’ requested here
return std::__1::search(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
^
/sw/src/fink.build/rstudio-desktop-0.98.1103-5/rstudio-0.98.1103/src/cpp/session/modules/SessionHTMLPreview.cpp:555:23: note: in instantiation of function template
specialization ‘std::__1::search<std::__1::istreambuf_iterator<char, std::__1::char_traits >, std::__1::__wrap_iter<char *> >’ requested here
if (eod == std::search(std::istreambuf_iterator(*pStr),
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/…/include/c++/v1/algorithm:1456:1: note: candidate function [with
_BinaryPredicate = std::__1::__equal_to<char, char> &, _RandomAccessIterator1 = std::__1::istreambuf_iterator<char, std::__1::char_traits >,
_RandomAccessIterator2 = std::__1::__wrap_iter<char *>] not viable: no known conversion from ‘typename std::iterator_traits<istreambuf_iterator<char,
char_traits > >::iterator_category’ (aka ‘std::__1::input_iterator_tag’) to ‘std::__1::random_access_iterator_tag’ for 6th argument
__search(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/…/include/c++/v1/algorithm:1419:1: note: candidate function [with
_BinaryPredicate = std::__1::__equal_to<char, char> &, _ForwardIterator1 = std::__1::istreambuf_iterator<char, std::__1::char_traits >,
_ForwardIterator2 = std::__1::__wrap_iter<char *>] not viable: no known conversion from ‘typename std::iterator_traits<istreambuf_iterator<char,
char_traits > >::iterator_category’ (aka ‘std::__1::input_iterator_tag’) to ‘std::__1::forward_iterator_tag’ for 6th argument
__search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
^
1 error generated.

Is this a valid error or a glitch in clang++/libc++?
Jack

I re-assigned the bug to libc++. I'll take a look tonight.

/Eric

    Can one of the libc++ experts take a peak at...

https://llvm.org/bugs/show_bug.cgi?id=23307

I am unclear why clang++ with libstdc++ tolerates the following code from
rstudio 0.98.1103...

const char* const MAGIC_GUID = "12861c30b10411e1afa60800200c9a66";
const char* const FIGURE_DIR = "figure-compile-notebook-12861c30b";

bool okToGenerateFile(const FilePath& rmdPath,
                      const std::string& extension,
                      std::string* pErrMsg)
{
   FilePath filePath = rmdPath.parent().complete(
                                    rmdPath.stem() + extension);

   if (filePath.exists())
   {
      boost::shared_ptr<std::istream> pStr;
      Error error = filePath.open_r(&pStr);
      if (error)
      {
         *pErrMsg = "Error opening file: " + error.summary();
         return false;
      }

      std::string magicGuid(MAGIC_GUID);
      std::istreambuf_iterator<char> eod;
      if (eod == std::search(std::istreambuf_iterator<char>(*pStr),
                             eod,

std::search requires a ForwardIterator. std::istreambuf_iterator is only an
InputIterator.
If you build with -D_GLIBCXX_CONCEPT_CHECKS then the libstdc++ build will
also fail.

I've reported this bug to the libstdc++ maintainers...

-- Marshall