https://github.com/llvmbot created 
https://github.com/llvm/llvm-project/pull/143496

Backport 77347d6513de6a6f5dee8ade76e0a0ad1552c12b

Requested by: @mstorsjo

>From 131293d552947fa64facc1ed9441f74027579b12 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Martin=20Storsj=C3=B6?= <mar...@martin.st>
Date: Tue, 10 Jun 2025 10:23:19 +0300
Subject: [PATCH] [llvm-rc] Allow ALT on non-virtkey accelerators (#143374)

While
https://learn.microsoft.com/en-us/windows/win32/menurc/accelerators-resource
specifies that ALT only applies to virtkeys, this doesn't seem to be the
case in reality.

https://learn.microsoft.com/en-us/windows/win32/menurc/using-keyboard-accelerators
contains an example that uses this combination:

    "B",   ID_ACCEL5, ALT                   ; ALT_SHIFT+B

Also Microsoft also includes such cases in their repo of test cases:
https://github.com/microsoft/Windows-classic-samples/blob/263dd514ad215d0a40d1ec44b4df84b30ec11dcf/Samples/Win7Samples/begin/sdkdiff/sdkdiff.rc#L161-L164

Also MS rc.exe doesn't warn/error about this. However if applying SHIFT
or CONTROL on a non-virtkey accelerator, MS rc.exe does produce this
warning:

    warning RC4203 : SHIFT or CONTROL used without VIRTKEY

Hence, keep the checks for SHIFT and CONTROL, but remove the checks for
ALT, which seems to have been incorrect.

This fixes one aspect of
https://github.com/llvm/llvm-project/issues/143157.

(cherry picked from commit 77347d6513de6a6f5dee8ade76e0a0ad1552c12b)
---
 .../llvm-rc/Inputs/tag-accelerators-ascii-alt.rc  |  4 ----
 .../test/tools/llvm-rc/Inputs/tag-accelerators.rc |  1 +
 llvm/test/tools/llvm-rc/tag-accelerators.test     | 15 +++++----------
 llvm/tools/llvm-rc/ResourceFileWriter.cpp         |  4 ++--
 4 files changed, 8 insertions(+), 16 deletions(-)
 delete mode 100644 llvm/test/tools/llvm-rc/Inputs/tag-accelerators-ascii-alt.rc

diff --git a/llvm/test/tools/llvm-rc/Inputs/tag-accelerators-ascii-alt.rc 
b/llvm/test/tools/llvm-rc/Inputs/tag-accelerators-ascii-alt.rc
deleted file mode 100644
index 363263bfe4cf2..0000000000000
--- a/llvm/test/tools/llvm-rc/Inputs/tag-accelerators-ascii-alt.rc
+++ /dev/null
@@ -1,4 +0,0 @@
-2 ACCELERATORS {
-  "A", 15, ASCII, ALT
-}
-
diff --git a/llvm/test/tools/llvm-rc/Inputs/tag-accelerators.rc 
b/llvm/test/tools/llvm-rc/Inputs/tag-accelerators.rc
index 90e7f926cc087..bcfc35bdeab68 100644
--- a/llvm/test/tools/llvm-rc/Inputs/tag-accelerators.rc
+++ b/llvm/test/tools/llvm-rc/Inputs/tag-accelerators.rc
@@ -110,5 +110,6 @@ LANGUAGE 5, 1
   "7", 71, VIRTKEY, NOINVERT, CONTROL, SHIFT, ALT
   "^j", 72, ASCII
   "^j", 73, ASCII, NOINVERT
+  "A", 15, ASCII, ALT
 }
 
diff --git a/llvm/test/tools/llvm-rc/tag-accelerators.test 
b/llvm/test/tools/llvm-rc/tag-accelerators.test
index 336727f617687..4f44aebc75011 100644
--- a/llvm/test/tools/llvm-rc/tag-accelerators.test
+++ b/llvm/test/tools/llvm-rc/tag-accelerators.test
@@ -37,7 +37,7 @@
 ; ACCELERATORS-NEXT: Version (major): 0
 ; ACCELERATORS-NEXT: Version (minor): 0
 ; ACCELERATORS-NEXT: Characteristics: 0
-; ACCELERATORS-NEXT: Data size: 592
+; ACCELERATORS-NEXT: Data size: 600
 ; ACCELERATORS-NEXT: Data: (
 ; ACCELERATORS-NEXT:   0000: 00002A00 00000000 01002A00 01000000  
|..*.......*.....|
 ; ACCELERATORS-NEXT:   0010: 02002A00 02000000 03002A00 03000000  
|..*.......*.....|
@@ -75,7 +75,8 @@
 ; ACCELERATORS-NEXT:   0210: 15003700 42000000 0F003700 43000000  
|..7.B.....7.C...|
 ; ACCELERATORS-NEXT:   0220: 1B003700 44000000 17003700 45000000  
|..7.D.....7.E...|
 ; ACCELERATORS-NEXT:   0230: 1D003700 46000000 1F003700 47000000  
|..7.F.....7.G...|
-; ACCELERATORS-NEXT:   0240: 00000A00 48000000 82000A00 49000000  
|....H.......I...|
+; ACCELERATORS-NEXT:   0240: 00000A00 48000000 02000A00 49000000  
|....H.......I...|
+; ACCELERATORS-NEXT:   0250: 90004100 0F000000                    |..A.....|
 ; ACCELERATORS-NEXT: )
 
 
@@ -94,19 +95,13 @@
 ; RUN: not llvm-rc -no-preprocess /FO %t -- 
%p/Inputs/tag-accelerators-ascii-control.rc 2>&1 | FileCheck %s --check-prefix 
ASCII2
 
 ; ASCII2: llvm-rc: Error in ACCELERATORS statement (ID 2):
-; ASCII2-NEXT: Accelerator ID 15: Can only apply ALT, SHIFT or CONTROL to 
VIRTKEY accelerators
+; ASCII2-NEXT: Accelerator ID 15: Can only apply SHIFT or CONTROL to VIRTKEY 
accelerators
 
 
 ; RUN: not llvm-rc -no-preprocess /FO %t -- 
%p/Inputs/tag-accelerators-ascii-shift.rc 2>&1 | FileCheck %s --check-prefix 
ASCII3
 
 ; ASCII3: llvm-rc: Error in ACCELERATORS statement (ID 2):
-; ASCII3-NEXT: Accelerator ID 15: Can only apply ALT, SHIFT or CONTROL to 
VIRTKEY accelerators
-
-
-; RUN: not llvm-rc -no-preprocess /FO %t -- 
%p/Inputs/tag-accelerators-ascii-alt.rc 2>&1 | FileCheck %s --check-prefix 
ASCII4
-
-; ASCII4: llvm-rc: Error in ACCELERATORS statement (ID 2):
-; ASCII4-NEXT: Accelerator ID 15: Can only apply ALT, SHIFT or CONTROL to 
VIRTKEY accelerators
+; ASCII3-NEXT: Accelerator ID 15: Can only apply SHIFT or CONTROL to VIRTKEY 
accelerators
 
 
 ; RUN: not llvm-rc -no-preprocess /FO %t -- 
%p/Inputs/tag-accelerators-bad-key-id.rc 2>&1 | FileCheck %s --check-prefix 
BADKEYID
diff --git a/llvm/tools/llvm-rc/ResourceFileWriter.cpp 
b/llvm/tools/llvm-rc/ResourceFileWriter.cpp
index 85b59532bb83b..35c0768e33322 100644
--- a/llvm/tools/llvm-rc/ResourceFileWriter.cpp
+++ b/llvm/tools/llvm-rc/ResourceFileWriter.cpp
@@ -631,8 +631,8 @@ Error ResourceFileWriter::writeSingleAccelerator(
   if (IsASCII && IsVirtKey)
     return createAccError("Accelerator can't be both ASCII and VIRTKEY");
 
-  if (!IsVirtKey && (Obj.Flags & (Opt::ALT | Opt::SHIFT | Opt::CONTROL)))
-    return createAccError("Can only apply ALT, SHIFT or CONTROL to VIRTKEY"
+  if (!IsVirtKey && (Obj.Flags & (Opt::SHIFT | Opt::CONTROL)))
+    return createAccError("Can only apply SHIFT or CONTROL to VIRTKEY"
                           " accelerators");
 
   if (Obj.Event.isInt()) {

_______________________________________________
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to