From: Aaron Ballman Date: Tue, 14 May 2019 12:09:55 +0000 (+0000) Subject: Add a new language mode for C2x; enable [[attribute]] support by default in C2x. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=05df5fccd515030158b5fee454ee72f2777247f1;p=clang Add a new language mode for C2x; enable [[attribute]] support by default in C2x. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@360667 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/LangOptions.def b/include/clang/Basic/LangOptions.def index 330f788be1..74186a1a6b 100644 --- a/include/clang/Basic/LangOptions.def +++ b/include/clang/Basic/LangOptions.def @@ -82,6 +82,7 @@ LANGOPT(C99 , 1, 0, "C99") LANGOPT(C11 , 1, 0, "C11") LANGOPT(C17 , 1, 0, "C17") +LANGOPT(C2x , 1, 0, "C2x") LANGOPT(MSVCCompat , 1, 0, "Microsoft Visual C++ full compatibility mode") LANGOPT(MicrosoftExt , 1, 0, "Microsoft C++ extensions") LANGOPT(AsmBlocks , 1, 0, "Microsoft inline asm blocks") diff --git a/include/clang/Frontend/LangStandard.h b/include/clang/Frontend/LangStandard.h index 406ca56cc3..244f14c793 100644 --- a/include/clang/Frontend/LangStandard.h +++ b/include/clang/Frontend/LangStandard.h @@ -22,16 +22,17 @@ enum LangFeatures { C99 = (1 << 1), C11 = (1 << 2), C17 = (1 << 3), - CPlusPlus = (1 << 4), - CPlusPlus11 = (1 << 5), - CPlusPlus14 = (1 << 6), - CPlusPlus17 = (1 << 7), - CPlusPlus2a = (1 << 8), - Digraphs = (1 << 9), - GNUMode = (1 << 10), - HexFloat = (1 << 11), - ImplicitInt = (1 << 12), - OpenCL = (1 << 13) + C2x = (1 << 4), + CPlusPlus = (1 << 5), + CPlusPlus11 = (1 << 6), + CPlusPlus14 = (1 << 7), + CPlusPlus17 = (1 << 8), + CPlusPlus2a = (1 << 9), + Digraphs = (1 << 10), + GNUMode = (1 << 11), + HexFloat = (1 << 12), + ImplicitInt = (1 << 13), + OpenCL = (1 << 14) }; } @@ -73,6 +74,9 @@ public: /// isC17 - Language is a superset of C17. bool isC17() const { return Flags & frontend::C17; } + /// isC2x - Language is a superset of C2x. + bool isC2x() const { return Flags & frontend::C2x; } + /// isCPlusPlus - Language is a C++ variant. bool isCPlusPlus() const { return Flags & frontend::CPlusPlus; } diff --git a/include/clang/Frontend/LangStandards.def b/include/clang/Frontend/LangStandards.def index 2fe6eb88ab..44a080d6d1 100644 --- a/include/clang/Frontend/LangStandards.def +++ b/include/clang/Frontend/LangStandards.def @@ -88,6 +88,14 @@ LANGSTANDARD(gnu17, "gnu17", LineComment | C99 | C11 | C17 | Digraphs | GNUMode | HexFloat) LANGSTANDARD_ALIAS(gnu17, "gnu18") +// C2x modes +LANGSTANDARD(c2x, "c2x", + C, "Working Draft for ISO C2x", + LineComment | C99 | C11 | C17 | C2x | Digraphs | HexFloat) +LANGSTANDARD(gnu2x, "gnu2x", + C, "Working Draft for ISO C2x with GNU extensions", + LineComment | C99 | C11 | C17 | C2x | Digraphs | GNUMode | HexFloat) + // C++ modes LANGSTANDARD(cxx98, "c++98", CXX, "ISO C++ 1998 with amendments", diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index c95c67af6a..e9137bb73c 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -2134,6 +2134,7 @@ void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK, Opts.C99 = Std.isC99(); Opts.C11 = Std.isC11(); Opts.C17 = Std.isC17(); + Opts.C2x = Std.isC2x(); Opts.CPlusPlus = Std.isCPlusPlus(); Opts.CPlusPlus11 = Std.isCPlusPlus11(); Opts.CPlusPlus14 = Std.isCPlusPlus14(); @@ -2200,6 +2201,9 @@ void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK, Opts.AlignedAllocation = Opts.CPlusPlus17; Opts.DollarIdents = !Opts.AsmPreprocessor; + + // Enable [[]] attributes in C++11 and C2x by default. + Opts.DoubleSquareBracketAttributes = Opts.CPlusPlus11 || Opts.C2x; } /// Attempt to parse a visibility value out of the given argument. @@ -2605,10 +2609,10 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK, Opts.BlocksRuntimeOptional = Args.hasArg(OPT_fblocks_runtime_optional); Opts.Coroutines = Opts.CPlusPlus2a || Args.hasArg(OPT_fcoroutines_ts); - // Enable [[]] attributes in C++11 by default. Opts.DoubleSquareBracketAttributes = Args.hasFlag(OPT_fdouble_square_bracket_attributes, - OPT_fno_double_square_bracket_attributes, Opts.CPlusPlus11); + OPT_fno_double_square_bracket_attributes, + Opts.DoubleSquareBracketAttributes); Opts.CPlusPlusModules = Opts.CPlusPlus2a; Opts.ModulesTS = Args.hasArg(OPT_fmodules_ts); diff --git a/test/Driver/unknown-std.c b/test/Driver/unknown-std.c index 8651550651..d87a968894 100644 --- a/test/Driver/unknown-std.c +++ b/test/Driver/unknown-std.c @@ -16,6 +16,8 @@ // CHECK-NEXT: note: use 'gnu11' for 'ISO C 2011 with GNU extensions' standard // CHECK-NEXT: note: use 'c17', 'iso9899:2017', 'c18', or 'iso9899:2018' for 'ISO C 2017' standard // CHECK-NEXT: note: use 'gnu17' or 'gnu18' for 'ISO C 2017 with GNU extensions' standard +// CHECK-NEXT: note: use 'c2x' for 'Working Draft for ISO C2x' standard +// CHECK-NEXT: note: use 'gnu2x' for 'Working Draft for ISO C2x with GNU extensions' standard // Make sure that no other output is present. // CHECK-NOT: {{^.+$}} diff --git a/test/Parser/c2x-attributes.c b/test/Parser/c2x-attributes.c index f261dee200..97f17ad4e7 100644 --- a/test/Parser/c2x-attributes.c +++ b/test/Parser/c2x-attributes.c @@ -1,4 +1,5 @@ // RUN: %clang_cc1 -fsyntax-only -fdouble-square-bracket-attributes -verify %s +// RUN: %clang_cc1 -fsyntax-only -std=gnu2x -verify %s enum [[]] E { One [[]], diff --git a/test/Sema/attr-cx2.c b/test/Sema/attr-cx2.c index 5b537625c1..ec74edf058 100644 --- a/test/Sema/attr-cx2.c +++ b/test/Sema/attr-cx2.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -verify -fdouble-square-bracket-attributes %s +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -verify -std=c2x %s struct S {}; struct S * [[clang::address_space(1)]] Foo; diff --git a/test/Sema/attr-deprecated-c2x.c b/test/Sema/attr-deprecated-c2x.c index 2505f1294c..744fb1f7c4 100644 --- a/test/Sema/attr-deprecated-c2x.c +++ b/test/Sema/attr-deprecated-c2x.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 %s -verify -fsyntax-only -fdouble-square-bracket-attributes +// RUN: %clang_cc1 %s -verify -fsyntax-only --std=c2x int f() [[deprecated]]; // expected-note 2 {{'f' has been explicitly marked deprecated here}} void g() [[deprecated]];// expected-note {{'g' has been explicitly marked deprecated here}} diff --git a/test/Sema/c2x-maybe_unused-errors.c b/test/Sema/c2x-maybe_unused-errors.c index 68150dded9..39ec2da9a1 100644 --- a/test/Sema/c2x-maybe_unused-errors.c +++ b/test/Sema/c2x-maybe_unused-errors.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsyntax-only -Wunused -fdouble-square-bracket-attributes -verify %s +// RUN: %clang_cc1 -fsyntax-only -Wunused -std=c2x -verify %s struct [[maybe_unused]] S1 { // ok int a [[maybe_unused]]; diff --git a/test/Sema/c2x-maybe_unused.c b/test/Sema/c2x-maybe_unused.c index 816cf7835f..82b9634fc9 100644 --- a/test/Sema/c2x-maybe_unused.c +++ b/test/Sema/c2x-maybe_unused.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsyntax-only -Wunused -fdouble-square-bracket-attributes -verify %s +// RUN: %clang_cc1 -fsyntax-only -Wunused -std=c2x -verify %s struct [[maybe_unused]] S1 { // ok int a [[maybe_unused]]; diff --git a/test/Sema/c2x-nodiscard.c b/test/Sema/c2x-nodiscard.c index fc5b12347e..5eaeda40d9 100644 --- a/test/Sema/c2x-nodiscard.c +++ b/test/Sema/c2x-nodiscard.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsyntax-only -fdouble-square-bracket-attributes -verify %s +// RUN: %clang_cc1 -fsyntax-only -std=c2x -verify %s struct [[nodiscard]] S1 { // ok int i;