aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2022-04-14 17:49:47 -0400
committerJason Merrill <jason@redhat.com>2022-04-14 21:55:08 -0400
commite580f81d22d61153564959f08d9a6d3bcc7fd386 (patch)
tree5bf77da86a01b4989520ba1cc78f91bd07dbdb73
parent6364a39907bd68624a30df0c8e380c40d2a646c4 (diff)
downloadgcc-e580f81d22d61153564959f08d9a6d3bcc7fd386.zip
gcc-e580f81d22d61153564959f08d9a6d3bcc7fd386.tar.gz
gcc-e580f81d22d61153564959f08d9a6d3bcc7fd386.tar.bz2
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.
-rw-r--r--gcc/cp/decl.cc2
-rw-r--r--gcc/testsuite/g++.dg/ext/unsigned-typedef1.C9
2 files changed, 11 insertions, 0 deletions
diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc
index d51fd75..2852093 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 0000000..360b5f8
--- /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);