@@ -459,85 +459,19 @@ TypeSystemClang::ConvertAccessTypeToAccessSpecifier(AccessType access) {
459459 return AS_none;
460460}
461461
462- static void ParseLangArgs (LangOptions &Opts, InputKind IK, const char *triple ) {
462+ static void ParseLangArgs (LangOptions &Opts, ArchSpec arch ) {
463463 // FIXME: Cleanup per-file based stuff.
464464
465- // Set some properties which depend solely on the input kind; it would be
466- // nice to move these to the language standard, and have the driver resolve
467- // the input kind + language standard.
468- if (IK.getLanguage () == clang::Language::Asm) {
469- Opts.AsmPreprocessor = 1 ;
470- } else if (IK.isObjectiveC ()) {
471- Opts.ObjC = 1 ;
472- }
473-
474- LangStandard::Kind LangStd = LangStandard::lang_unspecified;
475-
476- if (LangStd == LangStandard::lang_unspecified) {
477- // Based on the base language, pick one.
478- switch (IK.getLanguage ()) {
479- case clang::Language::Unknown:
480- case clang::Language::CIR:
481- case clang::Language::LLVM_IR:
482- case clang::Language::RenderScript:
483- llvm_unreachable (" Invalid input kind!" );
484- case clang::Language::OpenCL:
485- LangStd = LangStandard::lang_opencl10;
486- break ;
487- case clang::Language::OpenCLCXX:
488- LangStd = LangStandard::lang_openclcpp10;
489- break ;
490- case clang::Language::Asm:
491- case clang::Language::C:
492- case clang::Language::ObjC:
493- LangStd = LangStandard::lang_gnu99;
494- break ;
495- case clang::Language::CXX:
496- case clang::Language::ObjCXX:
497- LangStd = LangStandard::lang_gnucxx98;
498- break ;
499- case clang::Language::CUDA:
500- case clang::Language::HIP:
501- LangStd = LangStandard::lang_gnucxx17;
502- break ;
503- case clang::Language::HLSL:
504- LangStd = LangStandard::lang_hlsl;
505- break ;
506- }
507- }
508-
509- const LangStandard &Std = LangStandard::getLangStandardForKind (LangStd);
510- Opts.LineComment = Std.hasLineComments ();
511- Opts.C99 = Std.isC99 ();
512- Opts.CPlusPlus = Std.isCPlusPlus ();
513- Opts.CPlusPlus11 = Std.isCPlusPlus11 ();
514- Opts.CPlusPlus14 = Std.isCPlusPlus14 ();
515- Opts.CPlusPlus17 = Std.isCPlusPlus17 ();
516- Opts.CPlusPlus20 = Std.isCPlusPlus20 ();
517- Opts.Digraphs = Std.hasDigraphs ();
518- Opts.GNUMode = Std.isGNUMode ();
519- Opts.GNUInline = !Std.isC99 ();
520- Opts.HexFloats = Std.hasHexFloats ();
521-
522- Opts.WChar = true ;
523-
524- // OpenCL has some additional defaults.
525- if (LangStd == LangStandard::lang_opencl10) {
526- Opts.OpenCL = 1 ;
527- Opts.AltiVec = 1 ;
528- Opts.CXXOperatorNames = 1 ;
529- Opts.setLaxVectorConversions (LangOptions::LaxVectorConversionKind::All);
530- }
531-
532- // OpenCL and C++ both have bool, true, false keywords.
533- Opts.Bool = Opts.OpenCL || Opts.CPlusPlus ;
465+ std::vector<std::string> Includes;
466+ LangOptions::setLangDefaults (Opts, clang::Language::ObjCXX, arch.GetTriple (),
467+ Includes, clang::LangStandard::lang_gnucxx98);
534468
535469 Opts.setValueVisibilityMode (DefaultVisibility);
536470
537471 // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs is
538472 // specified, or -std is set to a conforming mode.
539473 Opts.Trigraphs = !Opts.GNUMode ;
540- Opts.CharIsSigned = ArchSpec (triple) .CharIsSignedByDefault ();
474+ Opts.CharIsSigned = arch .CharIsSignedByDefault ();
541475 Opts.OptimizeSize = 0 ;
542476
543477 // FIXME: Eliminate this dependency.
@@ -727,8 +661,7 @@ void TypeSystemClang::CreateASTContext() {
727661 m_ast_owned = true ;
728662
729663 m_language_options_up = std::make_unique<LangOptions>();
730- ParseLangArgs (*m_language_options_up, clang::Language::ObjCXX,
731- GetTargetTriple ());
664+ ParseLangArgs (*m_language_options_up, ArchSpec (GetTargetTriple ()));
732665
733666 m_identifier_table_up =
734667 std::make_unique<IdentifierTable>(*m_language_options_up, nullptr );
0 commit comments