Index: clang/include/clang/Basic/LangOptions.def =================================================================== --- clang/include/clang/Basic/LangOptions.def +++ clang/include/clang/Basic/LangOptions.def @@ -92,6 +92,7 @@ LANGOPT(MicrosoftExt , 1, 0, "Microsoft C++ extensions") LANGOPT(AsmBlocks , 1, 0, "Microsoft inline asm blocks") LANGOPT(Borland , 1, 0, "Borland extensions") +LANGOPT(Plan9 , 1, 0, "Plan 9 extensions") LANGOPT(CPlusPlus , 1, 0, "C++") LANGOPT(CPlusPlus11 , 1, 0, "C++11") LANGOPT(CPlusPlus14 , 1, 0, "C++14") Index: clang/include/clang/Driver/Options.td =================================================================== --- clang/include/clang/Driver/Options.td +++ clang/include/clang/Driver/Options.td @@ -1343,6 +1343,10 @@ LangOpts<"Borland">, DefaultFalse, PosFlag, NegFlag>; +defm plan9_extensions : BoolFOption<"plan9-extensions", + LangOpts<"Plan9">, DefaultFalse, + PosFlag, + NegFlag>; def fbuiltin : Flag<["-"], "fbuiltin">, Group, Flags<[CoreOption]>; def fbuiltin_module_map : Flag <["-"], "fbuiltin-module-map">, Group, Flags<[NoXarchOption]>, HelpText<"Load the clang builtins module map file.">; Index: clang/lib/Driver/ToolChains/Clang.cpp =================================================================== --- clang/lib/Driver/ToolChains/Clang.cpp +++ clang/lib/Driver/ToolChains/Clang.cpp @@ -6495,6 +6495,9 @@ Args.addOptInFlag(CmdArgs, options::OPT_fborland_extensions, options::OPT_fno_borland_extensions); + Args.addOptInFlag(CmdArgs, options::OPT_fplan9_extensions, + options::OPT_fno_plan9_extensions); + // -fno-declspec is default, except for PS4/PS5. if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec, RawTriple.isPS())) Index: clang/lib/Sema/SemaDecl.cpp =================================================================== --- clang/lib/Sema/SemaDecl.cpp +++ clang/lib/Sema/SemaDecl.cpp @@ -2560,8 +2560,8 @@ return New->setInvalidDecl(); } - // Modules always permit redefinition of typedefs, as does C11. - if (getLangOpts().Modules || getLangOpts().C11) + // Modules always permit redefinition of typedefs, as do C11 and Plan 9. + if (getLangOpts().Modules || getLangOpts().C11 || getLangOpts().Plan9) return; // If we have a redefinition of a typedef in C, emit a warning. This warning Index: clang/test/Sema/c11-typedef-redef.c =================================================================== --- clang/test/Sema/c11-typedef-redef.c +++ clang/test/Sema/c11-typedef-redef.c @@ -1,4 +1,5 @@ // RUN: %clang_cc1 -std=c11 %s -verify +// RUN: %clang_cc1 -fplan9-extensions %s -verify typedef int type; typedef type type;