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.
This commit is contained in:
Jason Merrill 2022-04-14 17:49:47 -04:00
parent 6364a39907
commit e580f81d22
2 changed files with 11 additions and 0 deletions

View File

@ -12243,6 +12243,8 @@ grokdeclarator (const cp_declarator *declarator,
pedwarn (loc, OPT_Wpedantic, "%qs specified with %qT", pedwarn (loc, OPT_Wpedantic, "%qs specified with %qT",
key, type); key, type);
ok = !flag_pedantic_errors; ok = !flag_pedantic_errors;
type = DECL_ORIGINAL_TYPE (typedef_decl);
typedef_decl = NULL_TREE;
} }
else if (declspecs->decltype_p) else if (declspecs->decltype_p)
error_at (loc, "%qs specified with %<decltype%>", key); error_at (loc, "%qs specified with %<decltype%>", key);

View File

@ -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);