[pushed] c++: unsigned int32_t enum promotion [PR102804]

Message ID 20220415010048.3512289-1-jason@redhat.com
State Committed
Commit e580f81d22d61153564959f08d9a6d3bcc7fd386
Headers
Series [pushed] c++: unsigned int32_t enum promotion [PR102804] |

Commit Message

Jason Merrill April 15, 2022, 1 a.m. UTC
  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.

Tested x86_64-pc-linux-gnu, applying to trunk.

	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


base-commit: 6364a39907bd68624a30df0c8e380c40d2a646c4
  

Patch

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