@@ -248,8 +248,8 @@ namespace
248248{
249249bool is_valid_binary (const std::string& binary)
250250{
251- tpl::Process process (binary + " -v " , " " , []( const char *, std:: size_t ) {},
252- [](const char *, std::size_t ) {});
251+ tpl::Process process (
252+ binary + " -v " , " " , []( const char *, std:: size_t ) {}, [](const char *, std::size_t ) {});
253253 return process.get_exit_status () == 0 ;
254254}
255255
@@ -262,11 +262,10 @@ bool is_valid_binary(const std::string& binary)
262262void add_default_include_dirs (libclang_compile_config& config)
263263{
264264 std::string verbose_output;
265- tpl::Process process (detail::libclang_compile_config_access::clang_binary (config)
266- + " -x c++ -v -" ,
267- " " , [](const char *, std::size_t ) {},
268- [&](const char * str, std::size_t n) { verbose_output.append (str, n); },
269- true );
265+ tpl::Process process (
266+ detail::libclang_compile_config_access::clang_binary (config) + " -x c++ -v -" , " " ,
267+ [](const char *, std::size_t ) {},
268+ [&](const char * str, std::size_t n) { verbose_output.append (str, n); }, true );
270269 process.write (" " , 1 );
271270 process.close_stdin ();
272271 process.get_exit_status ();
@@ -326,7 +325,9 @@ bool libclang_compile_config::set_clang_binary(std::string binary)
326325 // first search in current directory, then in PATH
327326 static const char * paths[]
328327 = {" ./clang++" , " clang++" , " ./clang++-4.0" , " clang++-4.0" , " ./clang++-5.0" ,
329- " clang++-5.0" , " ./clang++-6.0" , " clang++-6.0" , " ./clang-7" , " clang-7" };
328+ " clang++-5.0" , " ./clang++-6.0" , " clang++-6.0" , " ./clang-7" , " clang-7" ,
329+ " ./clang-8" , " clang-8" , " ./clang-9" , " clang-9" , " ./clang-10" ,
330+ " clang-10" , " ./clang-11" , " clang-11" };
330331 for (auto & p : paths)
331332 if (is_valid_binary (p))
332333 {
@@ -373,6 +374,39 @@ void libclang_compile_config::do_set_flags(cpp_standard standard, compile_flags
373374 else
374375 add_flag (" -std=c++1z" );
375376 break ;
377+ case cpp_standard::cpp_17:
378+ if (libclang_parser::libclang_minor_version () >= 43 )
379+ { // Corresponds to Clang version 5
380+ if (flags & compile_flag::gnu_extensions)
381+ add_flag (" -std=gnu++17" );
382+ else
383+ add_flag (" -std=c++17" );
384+ break ;
385+ }
386+ else
387+ throw std::invalid_argument (" c++17 is not yet supported for current version of clang" );
388+ case cpp_standard::cpp_2a:
389+ if (libclang_parser::libclang_minor_version () >= 59 )
390+ { // Corresponds to Clang version 9
391+ if (flags & compile_flag::gnu_extensions)
392+ add_flag (" -std=gnu++2a" );
393+ else
394+ add_flag (" -std=c++2a" );
395+ break ;
396+ }
397+ else
398+ throw std::invalid_argument (" c++2a is not yet supported for current version of clang" );
399+ case cpp_standard::cpp_20:
400+ if (libclang_parser::libclang_minor_version () >= 60 )
401+ { // Corresponds to Clang version 10
402+ if (flags & compile_flag::gnu_extensions)
403+ add_flag (" -std=gnu++20" );
404+ else
405+ add_flag (" -std=c++20" );
406+ break ;
407+ }
408+ else
409+ throw std::invalid_argument (" c++20 is not yet supported for current version of clang" );
376410 }
377411
378412 if (flags & compile_flag::ms_compatibility)
@@ -559,7 +593,8 @@ unsigned get_line_no(const CXCursor& cursor)
559593}
560594} // namespace
561595std::unique_ptr<cpp_file> libclang_parser::do_parse (const cpp_entity_index& idx, std::string path,
562- const compile_config& c) const try
596+ const compile_config& c) const
597+ try
563598{
564599 DEBUG_ASSERT (std::strcmp (c.name (), " libclang" ) == 0 , detail::precondition_error_handler{},
565600 " config has mismatched type" );
0 commit comments