Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2194911/?format=api
{ "id": 2194911, "url": "http://patchwork.ozlabs.org/api/patches/2194911/?format=api", "web_url": "http://patchwork.ozlabs.org/project/gcc/patch/20260210084350.29147-1-soggysocks206@gmail.com/", "project": { "id": 17, "url": "http://patchwork.ozlabs.org/api/projects/17/?format=api", "name": "GNU Compiler Collection", "link_name": "gcc", "list_id": "gcc-patches.gcc.gnu.org", "list_email": "gcc-patches@gcc.gnu.org", "web_url": null, "scm_url": null, "webscm_url": null, "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20260210084350.29147-1-soggysocks206@gmail.com>", "list_archive_url": null, "date": "2026-02-10T08:40:23", "name": "c++: improve diagnostics for unknown underlying type in enum [PR118374]", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "d346719f3c4994990d1e6dda569bc3e8fa8e1fe3", "submitter": { "id": 91423, "url": "http://patchwork.ozlabs.org/api/people/91423/?format=api", "name": "Ben Wu", "email": "soggysocks206@gmail.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/gcc/patch/20260210084350.29147-1-soggysocks206@gmail.com/mbox/", "series": [ { "id": 491622, "url": "http://patchwork.ozlabs.org/api/series/491622/?format=api", "web_url": "http://patchwork.ozlabs.org/project/gcc/list/?series=491622", "date": "2026-02-10T08:40:23", "name": "c++: improve diagnostics for unknown underlying type in enum [PR118374]", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/491622/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2194911/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2194911/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "gcc-patches@gcc.gnu.org" ], "Delivered-To": [ "patchwork-incoming@legolas.ozlabs.org", "gcc-patches@gcc.gnu.org" ], "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20230601 header.b=G/OhCXB9;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=2620:52:6:3111::32; helo=vm01.sourceware.org;\n envelope-from=gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org;\n receiver=patchwork.ozlabs.org)", "sourceware.org;\n\tdkim=pass (2048-bit key,\n unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20230601 header.b=G/OhCXB9", "sourceware.org;\n dmarc=pass (p=none dis=none) header.from=gmail.com", "sourceware.org; spf=pass smtp.mailfrom=gmail.com", "server2.sourceware.org;\n arc=none smtp.remote-ip=209.85.216.53" ], "Received": [ "from vm01.sourceware.org (vm01.sourceware.org\n [IPv6:2620:52:6:3111::32])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4f9FVk1mnVz1xtV\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 10 Feb 2026 19:44:46 +1100 (AEDT)", "from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id E44D64BA23CA\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 10 Feb 2026 08:44:43 +0000 (GMT)", "from mail-pj1-f53.google.com (mail-pj1-f53.google.com\n [209.85.216.53])\n by sourceware.org (Postfix) with ESMTPS id C713A4BA23CA\n for <gcc-patches@gcc.gnu.org>; Tue, 10 Feb 2026 08:44:14 +0000 (GMT)", "by mail-pj1-f53.google.com with SMTP id\n 98e67ed59e1d1-35305538592so3431739a91.0\n for <gcc-patches@gcc.gnu.org>; Tue, 10 Feb 2026 00:44:14 -0800 (PST)", "from PC.lan (71-212-83-35.tukw.qwest.net. [71.212.83.35])\n by smtp.gmail.com with ESMTPSA id\n 98e67ed59e1d1-354b45ad3eesm7888522a91.5.2026.02.10.00.44.12\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Tue, 10 Feb 2026 00:44:13 -0800 (PST)" ], "DKIM-Filter": [ "OpenDKIM Filter v2.11.0 sourceware.org E44D64BA23CA", "OpenDKIM Filter v2.11.0 sourceware.org C713A4BA23CA" ], "DMARC-Filter": "OpenDMARC Filter v1.4.2 sourceware.org C713A4BA23CA", "ARC-Filter": "OpenARC Filter v1.0.0 sourceware.org C713A4BA23CA", "ARC-Seal": "i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1770713055; cv=none;\n b=rR7wvhIDSr07uAH6Rqz6D7uzeQwq1hPbfuww9T9g6XXh2LljHUZz4Q5HWRHU5Yje5ZptosJwocUVF6o9OPrKfZKj3BqmcJ1oAuADFBE9TjlvX3CVbl2syCONV1lkLcrsqnqFNRByRTULNTkj/Fnk1TN8DBAR4wFbL2GSf+rPARY=", "ARC-Message-Signature": "i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1770713055; c=relaxed/simple;\n bh=hsIz+5D7CHsfmH/iJp5OcSkmG2Rk4LphLNAJqQdp4bs=;\n h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version;\n b=C4K3duzx3AyDWhBKaQV2ETK9NYE19QDalJG3dIn+MZn0Ev4ONSHIEs3vVnAenBB4ErVL70DXME95p+mUJpT4rCIMg0LDv6ln4scM4+V9xv034J2hny1s7UoowlBhUXrZzudiT6zebnZJa55YS9lrhpBGtYnQ3Z+GvxHz3uSs1/E=", "ARC-Authentication-Results": "i=1; server2.sourceware.org", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=gmail.com; s=20230601; t=1770713054; x=1771317854; darn=gcc.gnu.org;\n h=content-transfer-encoding:mime-version:message-id:date:subject:cc\n :to:from:from:to:cc:subject:date:message-id:reply-to;\n bh=3e8FquWaCIHI5g7TDJNLRlJ3ChVnG2H5zV8cAMUhAiA=;\n b=G/OhCXB90SbhletMUcJ+pvAsiIQSnrJyyJNmPztZWxibOuv4agk/ibiUS4Cuts21zo\n nUDXLnjJrvcISbwK+KRJcWHYC2efBOmwObPeNX1VNeVKrsc9WgRVumYj4Q7a8LdDKaQg\n ABKKdqsM9EJBgRAUshyV+7eZSt/GK2ZgJ89v402SYld5yYbKm8VEOgjUoRs+4eKjVBoZ\n XarNc5NJPrBsf9WGyGi013nER6hglgU3rt1E/H4VMABeT0jjG3xObpOrAo8f2x5DS3uO\n UzIKcCVyueRxdS/JG8mwPf3YZ8S7sDMPzW6Y9DDxdAkaq2W7flm37Y0YP3gvYP1eF02m\n RGCA==", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20230601; t=1770713054; x=1771317854;\n h=content-transfer-encoding:mime-version:message-id:date:subject:cc\n :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date\n :message-id:reply-to;\n bh=3e8FquWaCIHI5g7TDJNLRlJ3ChVnG2H5zV8cAMUhAiA=;\n b=ux0DzbafStNVJCJ2ytRj4CY+0jLpmn66ghed3p3l3yA4tE8nrsj8q3a2be+RWG/Uce\n W1EhLJtP9A24YMX9n1Di9ColwzRfMOtEZpkmtXU8oDhjgOPcKbYTbOs34xJbOkwtJG9h\n QrZ28HzwwWd4sd3tUxw5D7s8oRpFQomSEwfzolMqIiJra0BtWqPEujAgmMgL9p1UMaUX\n Ck8jhCTqrBwg2C0q1m8gaD18mJJJdN6FsQRoW9d8IcBpUaGBTT0KLNlExdjsWv+xPxjd\n YpvWN9bskb3F5r4t39XE8LZfnIiVYN6txLR+HvaTmgP2kOGBE3wIAscGt895sl3Y7oLL\n yOQA==", "X-Gm-Message-State": "AOJu0YyVLDjigucccc/2SysVnNETV/2TomputZqUZ5E+VT8jqjLDI74F\n n/bbm5CTaPY2JRLaEey4RBieyP6oQzPclKoQHRazhc12p2sfJvfeCuG3Knqqb8c8", "X-Gm-Gg": "AZuq6aK27M0hke9hn4zmKBqZRcLZmOGC5I4BSk184A5yRSnTCdSYZizsgnTR7X73mAS\n HHbyBTAuYIcx9yxGa5/Vjdlfb8PkQLPTfLJZ5l+mry0ojdopXqclEnj7RszzRlFR+ALOj+WIbUX\n ORVr1X/j1ZVOV6knNf6B3R49KDZ7tmIa7+1bz9OP5Z1d+wSb6Z53oyH1dCG7FbPU2PnzUt41ElX\n pqFGR3r2OPpDwPHzZM32hxLbG0XeN/tLjR0BiJSZWjowRwhGtznS2GPmICGx+gjVBOhu7xFTmBM\n hfO2vpJYlyeHn/ffQ3HhSCfj9WeogSpVPddCYkq33qwgX674MKncWwXmd6nEQ4xobI6OSWKFYM3\n z/EJAGfUzcaDVuumeQs8CzwHe6bi6hj0Lk5BGtdSrGMCHwOcd43GGlulO7KE3iDLcZIVmgzwHK0\n jFyk1a2me1e+s+EML2WA1tI0xI+QqdyCM+nSHVOeiK8gkUFIEWJj2UpfsZPwGxLlmBcfDQT+Atj\n 3TrvnO8F/n9e+2AyYCv347tuxoCSD70ODqBkCSvdLrqYgQTqUkjBn44jWWlPXGfEAJ/Pq8PtVg8\n Ha0njBz3tfrPudgX0h2j+Qkm/O26/PuH", "X-Received": "by 2002:a17:90b:5282:b0:352:c146:dc39 with SMTP id\n 98e67ed59e1d1-354b3e69a06mr10657347a91.30.1770713053561;\n Tue, 10 Feb 2026 00:44:13 -0800 (PST)", "From": "Ben Wu <soggysocks206@gmail.com>", "To": "gcc-patches@gcc.gnu.org", "Cc": "jason@redhat.com, ppalka@redhat.com, polacek@redhat.com,\n Ben Wu <soggysocks206@gmail.com>", "Subject": "[PATCH] c++: improve diagnostics for unknown underlying type in enum\n [PR118374]", "Date": "Tue, 10 Feb 2026 00:40:23 -0800", "Message-ID": "<20260210084350.29147-1-soggysocks206@gmail.com>", "X-Mailer": "git-send-email 2.52.0", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "X-BeenThere": "gcc-patches@gcc.gnu.org", "X-Mailman-Version": "2.1.30", "Precedence": "list", "List-Id": "Gcc-patches mailing list <gcc-patches.gcc.gnu.org>", "List-Unsubscribe": "<https://gcc.gnu.org/mailman/options/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=unsubscribe>", "List-Archive": "<https://gcc.gnu.org/pipermail/gcc-patches/>", "List-Post": "<mailto:gcc-patches@gcc.gnu.org>", "List-Help": "<mailto:gcc-patches-request@gcc.gnu.org?subject=help>", "List-Subscribe": "<https://gcc.gnu.org/mailman/listinfo/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe>", "Errors-To": "gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org" }, "content": "Tested on x86_64-pc-linux-gnu. Any thoughts welcome on these\ndiagnostics changes, or cases where valid code is now rejected.\n\nI'm not sure how to provide a fixit as suggested in the PR, but\nhopefully this is a start to better diagnostics for these testcases.\n\n-- 8< --\n\nInstead of returning NULL_TREE on an error when parsing an underlying\ntype for an enum, we can improve diagnostics by giving a clearer error\nand returning error_mark_node.\n\n\tPR c++/118374\n\ngcc/cp/ChangeLog:\n\n\t* parser.cc (cp_parser_enum_specifier): Emit new error and\n\treturn error_mark_node on failure to parse an underlying\n\ttype.\n\ngcc/testsuite/ChangeLog:\n\n\t* g++.dg/cpp0x/enum1.C: Adjust test to expect new error.\n\t* g++.dg/cpp0x/enum_base4.C: Likewise.\n\t* g++.dg/cpp0x/enum_base5.C: Likewise.\n\t* g++.dg/parse/enum5.C: Likewise.\n\t* g++.dg/cpp0x/enum45.C: New test.\n\n---\n gcc/cp/parser.cc | 12 +++++++++++-\n gcc/testsuite/g++.dg/cpp0x/enum1.C | 4 ++--\n gcc/testsuite/g++.dg/cpp0x/enum45.C | 4 ++++\n gcc/testsuite/g++.dg/cpp0x/enum_base4.C | 2 +-\n gcc/testsuite/g++.dg/cpp0x/enum_base5.C | 2 +-\n gcc/testsuite/g++.dg/parse/enum5.C | 2 +-\n 6 files changed, 20 insertions(+), 6 deletions(-)\n create mode 100644 gcc/testsuite/g++.dg/cpp0x/enum45.C", "diff": "diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc\nindex 5f1d028de0c..d8e148b62b3 100644\n--- a/gcc/cp/parser.cc\n+++ b/gcc/cp/parser.cc\n@@ -23825,7 +23825,17 @@ cp_parser_enum_specifier (cp_parser* parser)\n \n /* At this point this is surely not elaborated type specifier. */\n if (!cp_parser_parse_definitely (parser))\n-\treturn NULL_TREE;\n+\t{\n+\t error_at (type_start_token->location, \"invalid underlying type\");\n+\t cp_parser_commit_to_tentative_parse (parser);\n+\t cp_parser_skip_to_end_of_block_or_statement (parser);\n+\t cp_token *prev_tok = cp_lexer_previous_token (parser->lexer);\n+\t if (prev_tok->type == CPP_SEMICOLON)\n+\t cp_lexer_set_token_position (parser->lexer,\n+\t cp_lexer_previous_token_position (parser->lexer));\n+\n+\t return error_mark_node;\n+\t}\n \n if (cxx_dialect < cxx11)\n maybe_warn_cpp0x (CPP0X_SCOPED_ENUMS);\ndiff --git a/gcc/testsuite/g++.dg/cpp0x/enum1.C b/gcc/testsuite/g++.dg/cpp0x/enum1.C\nindex bf174295248..c3b3dba3c44 100644\n--- a/gcc/testsuite/g++.dg/cpp0x/enum1.C\n+++ b/gcc/testsuite/g++.dg/cpp0x/enum1.C\n@@ -1,5 +1,5 @@\n // PR c++/38021\n // { dg-do compile { target c++11 } }\n \n-enum : { };\t// { dg-error \"expected\" }\n-enum : 3 { };\t// { dg-error \"expected\" }\n+enum : { };\t// { dg-error \"invalid underlying type\" }\n+enum : 3 { };\t// { dg-error \"invalid underlying type\" }\ndiff --git a/gcc/testsuite/g++.dg/cpp0x/enum45.C b/gcc/testsuite/g++.dg/cpp0x/enum45.C\nnew file mode 100644\nindex 00000000000..b2eb7b3fbe4\n--- /dev/null\n+++ b/gcc/testsuite/g++.dg/cpp0x/enum45.C\n@@ -0,0 +1,4 @@\n+// PR c++/118374\n+// { dg-do compile { target c++11 } }\n+\n+enum class X : bogus; // { dg-error \"invalid underlying type\" }\ndiff --git a/gcc/testsuite/g++.dg/cpp0x/enum_base4.C b/gcc/testsuite/g++.dg/cpp0x/enum_base4.C\nindex b3015256386..6330070b47c 100644\n--- a/gcc/testsuite/g++.dg/cpp0x/enum_base4.C\n+++ b/gcc/testsuite/g++.dg/cpp0x/enum_base4.C\n@@ -4,5 +4,5 @@\n extern const int a, b;\n enum struct c;\n template <class>\n-enum struct c : union enum struct c { e = b, f = a }; // { dg-error \"types may not be defined|expected|elaborated-type-specifier\" }\n+enum struct c : union enum struct c { e = b, f = a }; // { dg-error \"types may not be defined|invalid underlying type\" }\n enum class c {};\ndiff --git a/gcc/testsuite/g++.dg/cpp0x/enum_base5.C b/gcc/testsuite/g++.dg/cpp0x/enum_base5.C\nindex c01e857e612..44e132c83bc 100644\n--- a/gcc/testsuite/g++.dg/cpp0x/enum_base5.C\n+++ b/gcc/testsuite/g++.dg/cpp0x/enum_base5.C\n@@ -4,4 +4,4 @@\n extern const int a, b;\n enum struct c;\n template <class>\n-enum struct c : union enum struct c { e = b, f = a }; // { dg-error \"types may not be defined|expected|elaborated-type-specifier\" }\n+enum struct c : union enum struct c { e = b, f = a }; // { dg-error \"types may not be defined|invalid underlying type\" }\ndiff --git a/gcc/testsuite/g++.dg/parse/enum5.C b/gcc/testsuite/g++.dg/parse/enum5.C\nindex 18480520a6f..001fa04edab 100644\n--- a/gcc/testsuite/g++.dg/parse/enum5.C\n+++ b/gcc/testsuite/g++.dg/parse/enum5.C\n@@ -7,7 +7,7 @@ typedef unsigned int T;\n struct D {\n T : sizeof(unsigned int) * CHAR_BIT; // OK\n EE : sizeof(EE) * CHAR_BIT; // OK\n- enum EE : sizeof(EE) * CHAR_BIT; // not OK\n+ enum EE : sizeof(EE) * CHAR_BIT; // { dg-error \"invalid underlying type\" }\n enum EE xxxx : sizeof(EE) * CHAR_BIT; // OK\n T x : sizeof(unsigned int) * CHAR_BIT; // OK\n enum FF {ff} : sizeof(FF) * CHAR_BIT; // OK\n", "prefixes": [] }