c++: unsigned int32_t enum promotion [PR102804]
authorJason Merrill <jason@redhat.com>
Thu, 14 Apr 2022 21:49:47 +0000 (17:49 -0400)
committerJason Merrill <jason@redhat.com>
Fri, 15 Apr 2022 01:55:08 +0000 (21:55 -0400)
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
gcc/testsuite/g++.dg/ext/unsigned-typedef1.C [new file with mode: 0644]

index d51fd75..2852093 100644 (file)
@@ -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 %<decltype%>", 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 (file)
index 0000000..360b5f8
--- /dev/null
@@ -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);