From e580f81d22d61153564959f08d9a6d3bcc7fd386 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Thu, 14 Apr 2022 17:49:47 -0400 Subject: [PATCH] c++: unsigned int32_t enum promotion [PR102804] There's been an extension for a long time to allow applying 'unsigned' to an int typedef, but that was confusing the integer promotion code. Fixed by forgetting about the typedef in that case. I'm going to make this an unconditional pedwarn in stage 1. PR c++/102804 gcc/cp/ChangeLog: * decl.cc (grokdeclarator): Drop typedef used with 'unsigned'. gcc/testsuite/ChangeLog: * g++.dg/ext/unsigned-typedef1.C: New test. --- gcc/cp/decl.cc | 2 ++ gcc/testsuite/g++.dg/ext/unsigned-typedef1.C | 9 +++++++++ 2 files changed, 11 insertions(+) create mode 100644 gcc/testsuite/g++.dg/ext/unsigned-typedef1.C diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc index d51fd75b003..2852093d624 100644 --- a/gcc/cp/decl.cc +++ b/gcc/cp/decl.cc @@ -12243,6 +12243,8 @@ grokdeclarator (const cp_declarator *declarator, pedwarn (loc, OPT_Wpedantic, "%qs specified with %qT", key, type); ok = !flag_pedantic_errors; + type = DECL_ORIGINAL_TYPE (typedef_decl); + typedef_decl = NULL_TREE; } else if (declspecs->decltype_p) error_at (loc, "%qs specified with %", key); diff --git a/gcc/testsuite/g++.dg/ext/unsigned-typedef1.C b/gcc/testsuite/g++.dg/ext/unsigned-typedef1.C new file mode 100644 index 00000000000..360b5f81edf --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/unsigned-typedef1.C @@ -0,0 +1,9 @@ +// PR c++/102804 +// { dg-do compile { target c++11 } } +// { dg-options "-Wpedantic" } + +using int32_t = int; +enum: unsigned int32_t { foo }; // { dg-warning "int32_t" } +int f(int) = delete; +int f(unsigned); +auto x = f(1 ? foo : 1); -- 2.11.4.GIT