From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from esa1.mentor.iphmx.com (esa1.mentor.iphmx.com [68.232.129.153]) by sourceware.org (Postfix) with ESMTPS id A3AB03858D39 for ; Thu, 18 Aug 2022 23:02:50 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org A3AB03858D39 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=codesourcery.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=mentor.com X-IronPort-AV: E=Sophos;i="5.93,247,1654588800"; d="scan'208";a="84303968" Received: from orw-gwy-01-in.mentorg.com ([192.94.38.165]) by esa1.mentor.iphmx.com with ESMTP; 18 Aug 2022 15:02:49 -0800 IronPort-SDR: ca168EUUfER3PzjxGnbY5n9IwM4sVSieYZ6hQRPwEtCkjLc0MXForZCgCuMBAixalrqhMv5ywL f50IB2LGZjol3AyXxPdkZ+yTl1SaT5hmobfeTchuZjKaYtL/okSVqujjudJgwsALjRWccpvoy+ QGM8POGf+gPJ/HW2S26H1jHCp1RUqYWJ3O6b26g7Bgpm2fgHOuIgHXYzIkrw4C/hOL92yquug5 FL/Ud9CUQOFQ8dCRewramIxzsVKetAPnIF4EQQcZMvg5uPYxbn92ySnVHpp8Yq+hapjfhlS7Pq qfw= Date: Thu, 18 Aug 2022 23:02:44 +0000 From: Joseph Myers X-X-Sender: jsm28@digraph.polyomino.org.uk To: Subject: [committed] preprocessor: Support #warning for standard C2x Message-ID: User-Agent: Alpine 2.22 (DEB 394 2020-01-19) MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" X-Originating-IP: [137.202.0.90] X-ClientProxiedBy: svr-ies-mbx-14.mgc.mentorg.com (139.181.222.14) To svr-ies-mbx-10.mgc.mentorg.com (139.181.222.10) X-Spam-Status: No, score=-3115.7 required=5.0 tests=BAYES_00, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, KAM_DMARC_STATUS, SCC_10_SHORT_WORD_LINES, SCC_20_SHORT_WORD_LINES, SCC_35_SHORT_WORD_LINES, SCC_5_SHORT_WORD_LINES, SPF_HELO_PASS, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 18 Aug 2022 23:02:53 -0000 ISO C2x standardizes the existing #warning extension. Arrange accordingly for it not to be diagnosed with -std=c2x -pedantic, but to be diagnosed with -Wc11-c2x-compat. Bootstrapped with no regressions for x86_64-pc-linux-gnu. gcc/testsuite/ * gcc.dg/cpp/c11-warning-1.c, gcc.dg/cpp/c11-warning-2.c, gcc.dg/cpp/c11-warning-3.c, gcc.dg/cpp/c11-warning-4.c, gcc.dg/cpp/c2x-warning-1.c, gcc.dg/cpp/c2x-warning-2.c, gcc.dg/cpp/gnu11-warning-1.c, gcc.dg/cpp/gnu11-warning-2.c, gcc.dg/cpp/gnu11-warning-3.c, gcc.dg/cpp/gnu11-warning-4.c, gcc.dg/cpp/gnu2x-warning-1.c, gcc.dg/cpp/gnu2x-warning-2.c: New tests. libcpp/ * include/cpplib.h (struct cpp_options): Add warning_directive. * init.cc (struct lang_flags, lang_defaults): Add warning_directive. * directives.cc (DIRECTIVE_TABLE): Mark #warning as STDC2X not EXTENSION. (directive_diagnostics): Diagnose #warning with -Wc11-c2x-compat, or with -pedantic for a standard not supporting #warning. diff --git a/gcc/testsuite/gcc.dg/cpp/c11-warning-1.c b/gcc/testsuite/gcc.dg/cpp/c11-warning-1.c new file mode 100644 index 00000000000..45d1ff874e9 --- /dev/null +++ b/gcc/testsuite/gcc.dg/cpp/c11-warning-1.c @@ -0,0 +1,6 @@ +/* Test #warning not in C11. */ +/* { dg-do preprocess } */ +/* { dg-options "-std=c11 -pedantic-errors" } */ + +#warning example text /* { dg-warning "example text" } */ +/* { dg-error "#warning before C2X is a GCC extension" "pedantic" { target *-*-* } .-1 } */ diff --git a/gcc/testsuite/gcc.dg/cpp/c11-warning-2.c b/gcc/testsuite/gcc.dg/cpp/c11-warning-2.c new file mode 100644 index 00000000000..ba385bf60fb --- /dev/null +++ b/gcc/testsuite/gcc.dg/cpp/c11-warning-2.c @@ -0,0 +1,6 @@ +/* Test #warning not in C11. */ +/* { dg-do preprocess } */ +/* { dg-options "-std=c11 -pedantic" } */ + +#warning example text /* { dg-warning "example text" } */ +/* { dg-warning "#warning before C2X is a GCC extension" "pedantic" { target *-*-* } .-1 } */ diff --git a/gcc/testsuite/gcc.dg/cpp/c11-warning-3.c b/gcc/testsuite/gcc.dg/cpp/c11-warning-3.c new file mode 100644 index 00000000000..8d74fcdaea4 --- /dev/null +++ b/gcc/testsuite/gcc.dg/cpp/c11-warning-3.c @@ -0,0 +1,6 @@ +/* Test #warning not in C11. */ +/* { dg-do preprocess } */ +/* { dg-options "-std=c11 -Wc11-c2x-compat" } */ + +#warning example text /* { dg-warning "example text" } */ +/* { dg-warning "#warning before C2X is a GCC extension" "compat" { target *-*-* } .-1 } */ diff --git a/gcc/testsuite/gcc.dg/cpp/c11-warning-4.c b/gcc/testsuite/gcc.dg/cpp/c11-warning-4.c new file mode 100644 index 00000000000..0af93f3f459 --- /dev/null +++ b/gcc/testsuite/gcc.dg/cpp/c11-warning-4.c @@ -0,0 +1,6 @@ +/* Test #warning not in C11. */ +/* { dg-do preprocess } */ +/* { dg-options "-std=c11" } */ + +#warning example text /* { dg-warning "example text" } */ +/* Not diagnosed by default. */ diff --git a/gcc/testsuite/gcc.dg/cpp/c2x-warning-1.c b/gcc/testsuite/gcc.dg/cpp/c2x-warning-1.c new file mode 100644 index 00000000000..696a0cd7aad --- /dev/null +++ b/gcc/testsuite/gcc.dg/cpp/c2x-warning-1.c @@ -0,0 +1,5 @@ +/* Test #warning in C2x. */ +/* { dg-do preprocess } */ +/* { dg-options "-std=c2x -pedantic-errors" } */ + +#warning example text /* { dg-warning "example text" } */ diff --git a/gcc/testsuite/gcc.dg/cpp/c2x-warning-2.c b/gcc/testsuite/gcc.dg/cpp/c2x-warning-2.c new file mode 100644 index 00000000000..3042e7a088c --- /dev/null +++ b/gcc/testsuite/gcc.dg/cpp/c2x-warning-2.c @@ -0,0 +1,6 @@ +/* Test #warning in C2x: -Wc11-c2x-comapt. */ +/* { dg-do preprocess } */ +/* { dg-options "-std=c2x -pedantic-errors -Wc11-c2x-compat" } */ + +#warning example text /* { dg-warning "example text" } */ +/* { dg-warning "#warning before C2X is a GCC extension" "compat" { target *-*-* } .-1 } */ diff --git a/gcc/testsuite/gcc.dg/cpp/gnu11-warning-1.c b/gcc/testsuite/gcc.dg/cpp/gnu11-warning-1.c new file mode 100644 index 00000000000..7dda115ab3e --- /dev/null +++ b/gcc/testsuite/gcc.dg/cpp/gnu11-warning-1.c @@ -0,0 +1,6 @@ +/* Test #warning not in C11. */ +/* { dg-do preprocess } */ +/* { dg-options "-std=gnu11 -pedantic-errors" } */ + +#warning example text /* { dg-warning "example text" } */ +/* { dg-error "#warning before C2X is a GCC extension" "pedantic" { target *-*-* } .-1 } */ diff --git a/gcc/testsuite/gcc.dg/cpp/gnu11-warning-2.c b/gcc/testsuite/gcc.dg/cpp/gnu11-warning-2.c new file mode 100644 index 00000000000..af2cc349702 --- /dev/null +++ b/gcc/testsuite/gcc.dg/cpp/gnu11-warning-2.c @@ -0,0 +1,6 @@ +/* Test #warning not in C11. */ +/* { dg-do preprocess } */ +/* { dg-options "-std=gnu11 -pedantic" } */ + +#warning example text /* { dg-warning "example text" } */ +/* { dg-warning "#warning before C2X is a GCC extension" "pedantic" { target *-*-* } .-1 } */ diff --git a/gcc/testsuite/gcc.dg/cpp/gnu11-warning-3.c b/gcc/testsuite/gcc.dg/cpp/gnu11-warning-3.c new file mode 100644 index 00000000000..22b7b50e108 --- /dev/null +++ b/gcc/testsuite/gcc.dg/cpp/gnu11-warning-3.c @@ -0,0 +1,6 @@ +/* Test #warning not in C11. */ +/* { dg-do preprocess } */ +/* { dg-options "-std=gnu11 -Wc11-c2x-compat" } */ + +#warning example text /* { dg-warning "example text" } */ +/* { dg-warning "#warning before C2X is a GCC extension" "compat" { target *-*-* } .-1 } */ diff --git a/gcc/testsuite/gcc.dg/cpp/gnu11-warning-4.c b/gcc/testsuite/gcc.dg/cpp/gnu11-warning-4.c new file mode 100644 index 00000000000..fd8ecfbef6e --- /dev/null +++ b/gcc/testsuite/gcc.dg/cpp/gnu11-warning-4.c @@ -0,0 +1,6 @@ +/* Test #warning not in C11. */ +/* { dg-do preprocess } */ +/* { dg-options "-std=gnu11" } */ + +#warning example text /* { dg-warning "example text" } */ +/* Not diagnosed by default. */ diff --git a/gcc/testsuite/gcc.dg/cpp/gnu2x-warning-1.c b/gcc/testsuite/gcc.dg/cpp/gnu2x-warning-1.c new file mode 100644 index 00000000000..c8e5290f280 --- /dev/null +++ b/gcc/testsuite/gcc.dg/cpp/gnu2x-warning-1.c @@ -0,0 +1,5 @@ +/* Test #warning in C2x. */ +/* { dg-do preprocess } */ +/* { dg-options "-std=gnu2x -pedantic-errors" } */ + +#warning example text /* { dg-warning "example text" } */ diff --git a/gcc/testsuite/gcc.dg/cpp/gnu2x-warning-2.c b/gcc/testsuite/gcc.dg/cpp/gnu2x-warning-2.c new file mode 100644 index 00000000000..3aef4b328fc --- /dev/null +++ b/gcc/testsuite/gcc.dg/cpp/gnu2x-warning-2.c @@ -0,0 +1,6 @@ +/* Test #warning in C2x: -Wc11-c2x-comapt. */ +/* { dg-do preprocess } */ +/* { dg-options "-std=gnu2x -pedantic-errors -Wc11-c2x-compat" } */ + +#warning example text /* { dg-warning "example text" } */ +/* { dg-warning "#warning before C2X is a GCC extension" "compat" { target *-*-* } .-1 } */ diff --git a/libcpp/directives.cc b/libcpp/directives.cc index 4104d5166e2..802bd8c8bb5 100644 --- a/libcpp/directives.cc +++ b/libcpp/directives.cc @@ -158,7 +158,7 @@ static void cpp_pop_definition (cpp_reader *, struct def_pragma_macro *); D(elifndef, T_ELIFNDEF, STDC2X, COND | ELIFDEF) \ D(error, T_ERROR, STDC89, 0) \ D(pragma, T_PRAGMA, STDC89, IN_I) \ - D(warning, T_WARNING, EXTENSION, 0) \ + D(warning, T_WARNING, STDC2X, 0) \ D(include_next, T_INCLUDE_NEXT, EXTENSION, INCL | EXPAND) \ D(ident, T_IDENT, EXTENSION, IN_I) \ D(import, T_IMPORT, EXTENSION, INCL | EXPAND) /* ObjC */ \ @@ -385,6 +385,15 @@ directive_diagnostics (cpp_reader *pfile, const directive *dir, int indented) && !(dir == &dtable[T_IMPORT] && CPP_OPTION (pfile, objc)) && CPP_PEDANTIC (pfile)) cpp_error (pfile, CPP_DL_PEDWARN, "#%s is a GCC extension", dir->name); + else if (dir == &dtable[T_WARNING]) + { + if (CPP_PEDANTIC (pfile) && !CPP_OPTION (pfile, warning_directive)) + cpp_error (pfile, CPP_DL_PEDWARN, + "#%s before C2X is a GCC extension", dir->name); + else if (CPP_OPTION (pfile, cpp_warn_c11_c2x_compat) > 0) + cpp_warning (pfile, CPP_W_C11_C2X_COMPAT, + "#%s before C2X is a GCC extension", dir->name); + } else if (((dir->flags & DEPRECATED) != 0 || (dir == &dtable[T_IMPORT] && !CPP_OPTION (pfile, objc))) && CPP_OPTION (pfile, cpp_warn_deprecated)) diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h index 26e2b4cf472..58ed51d845c 100644 --- a/libcpp/include/cpplib.h +++ b/libcpp/include/cpplib.h @@ -513,6 +513,9 @@ struct cpp_options /* Nonzero for the '#elifdef' and '#elifndef' directives. */ unsigned char elifdef; + /* Nonzero for the '#warning' directive. */ + unsigned char warning_directive; + /* Nonzero means tokenize C++20 module directives. */ unsigned char module_directives; diff --git a/libcpp/init.cc b/libcpp/init.cc index 59641a7f876..8d99bdb1b8d 100644 --- a/libcpp/init.cc +++ b/libcpp/init.cc @@ -96,34 +96,35 @@ struct lang_flags char dfp_constants; char size_t_literals; char elifdef; + char warning_directive; }; static const struct lang_flags lang_defaults[] = -{ /* c99 c++ xnum xid c11 std digr ulit rlit udlit bincst digsep trig u8chlit vaopt scope dfp szlit elifdef */ - /* GNUC89 */ { 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 }, - /* GNUC99 */ { 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 }, - /* GNUC11 */ { 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 }, - /* GNUC17 */ { 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 }, - /* GNUC2X */ { 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1 }, - /* STDC89 */ { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, - /* STDC94 */ { 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, - /* STDC99 */ { 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, - /* STDC11 */ { 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, - /* STDC17 */ { 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, - /* STDC2X */ { 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1 }, - /* GNUCXX */ { 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 }, - /* CXX98 */ { 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0 }, - /* GNUCXX11 */ { 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0 }, - /* CXX11 */ { 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0 }, - /* GNUCXX14 */ { 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0 }, - /* CXX14 */ { 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0 }, - /* GNUCXX17 */ { 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0 }, - /* CXX17 */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0 }, - /* GNUCXX20 */ { 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0 }, - /* CXX20 */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0 }, - /* GNUCXX23 */ { 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1 }, - /* CXX23 */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1 }, - /* ASM */ { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } +{ /* c99 c++ xnum xid c11 std digr ulit rlit udlit bincst digsep trig u8chlit vaopt scope dfp szlit elifdef warndir */ + /* GNUC89 */ { 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 }, + /* GNUC99 */ { 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 }, + /* GNUC11 */ { 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 }, + /* GNUC17 */ { 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 }, + /* GNUC2X */ { 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1 }, + /* STDC89 */ { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, + /* STDC94 */ { 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, + /* STDC99 */ { 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, + /* STDC11 */ { 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, + /* STDC17 */ { 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, + /* STDC2X */ { 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1 }, + /* GNUCXX */ { 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 }, + /* CXX98 */ { 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0 }, + /* GNUCXX11 */ { 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 }, + /* CXX11 */ { 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0 }, + /* GNUCXX14 */ { 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0 }, + /* CXX14 */ { 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0 }, + /* GNUCXX17 */ { 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0 }, + /* CXX17 */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0 }, + /* GNUCXX20 */ { 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0 }, + /* CXX20 */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0 }, + /* GNUCXX23 */ { 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0 }, + /* CXX23 */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0 }, + /* ASM */ { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; /* Sets internal flags correctly for a given language. */ @@ -153,6 +154,7 @@ cpp_set_lang (cpp_reader *pfile, enum c_lang lang) CPP_OPTION (pfile, dfp_constants) = l->dfp_constants; CPP_OPTION (pfile, size_t_literals) = l->size_t_literals; CPP_OPTION (pfile, elifdef) = l->elifdef; + CPP_OPTION (pfile, warning_directive) = l->warning_directive; } /* Initialize library global state. */ -- Joseph S. Myers joseph@codesourcery.com