Author: Akira Hatanaka
Date: 2026-06-05T08:35:16-07:00
New Revision: 383e5d2a6907410dc3486604bdaae0c18cbf111c

URL: 
https://github.com/llvm/llvm-project/commit/383e5d2a6907410dc3486604bdaae0c18cbf111c
DIFF: 
https://github.com/llvm/llvm-project/commit/383e5d2a6907410dc3486604bdaae0c18cbf111c.diff

LOG: [Driver] Don't warn on ObjC constant-literal flags for non-ObjC inputs 
(#200303)

-fobjc-constant-literals and the per-kind
-f[no-]constant-ns{number,array, dictionary}-literals flags are only
acted on for Objective-C inputs. When a build system passes them
uniformly to every source via a shared response file, they go unclaimed
on assembly and C/C++ inputs and trigger:

  error: argument unused during compilation: '-fobjc-constant-literals'
         [-Werror,-Wunused-command-line-argument]

Mark the options NoArgumentUnused so the unused argument is ignored
regardless of input type or whether the cc1 or cc1as path runs. The
behavior of the flags is unchanged: only the positive forms are
forwarded to cc1, and only for ObjC inputs.

rdar://175647747

Added: 
    

Modified: 
    clang/include/clang/Options/Options.td
    clang/test/Driver/objc-constant-literals.m

Removed: 
    


################################################################################
diff  --git a/clang/include/clang/Options/Options.td 
b/clang/include/clang/Options/Options.td
index 281ccc9614b58..4fd892e58df86 100644
--- a/clang/include/clang/Options/Options.td
+++ b/clang/include/clang/Options/Options.td
@@ -2138,7 +2138,7 @@ defm objc_constant_literals : 
BoolFOption<"objc-constant-literals",
   LangOpts<"ObjCConstantLiterals">, DefaultFalse,
   PosFlag<SetTrue, [], [CC1Option], "Enable">,
   NegFlag<SetFalse, [], [], "Disable">,
-  BothFlags<[], [ClangOption], " compile-time constant ObjC literals">>;
+  BothFlags<[NoArgumentUnused], [ClangOption], " compile-time constant ObjC 
literals">>;
 def fconstant_array_class_EQ : Joined<["-"], "fconstant-array-class=">, 
Group<f_Group>,
   Visibility<[ClangOption, CC1Option]>,
   MarshallingInfoString<LangOpts<"ObjCConstantArrayClass">>;
@@ -3820,17 +3820,17 @@ defm constant_nsnumber_literals : 
BoolFOption<"constant-nsnumber-literals",
   LangOpts<"ConstantNSNumberLiterals">, DefaultFalse,
   PosFlag<SetTrue, [], [CC1Option], "Enable">,
   NegFlag<SetFalse, [], [], "Disable">,
-  BothFlags<[], [ClangOption], " compile-time constant NSNumber literals">>;
+  BothFlags<[NoArgumentUnused], [ClangOption], " compile-time constant 
NSNumber literals">>;
 defm constant_nsarray_literals : BoolFOption<"constant-nsarray-literals",
   LangOpts<"ConstantNSArrayLiterals">, DefaultFalse,
   PosFlag<SetTrue, [], [CC1Option], "Enable">,
   NegFlag<SetFalse, [], [], "Disable">,
-  BothFlags<[], [ClangOption], " compile-time constant NSArray literals">>;
+  BothFlags<[NoArgumentUnused], [ClangOption], " compile-time constant NSArray 
literals">>;
 defm constant_nsdictionary_literals : 
BoolFOption<"constant-nsdictionary-literals",
   LangOpts<"ConstantNSDictionaryLiterals">, DefaultFalse,
   PosFlag<SetTrue, [], [CC1Option], "Enable">,
   NegFlag<SetFalse, [], [], "Disable">,
-  BothFlags<[], [ClangOption], " compile-time constant NSDictionary 
literals">>;
+  BothFlags<[NoArgumentUnused], [ClangOption], " compile-time constant 
NSDictionary literals">>;
 def fno_common : Flag<["-"], "fno-common">, Group<f_Group>,
   Visibility<[ClangOption, CC1Option]>,
     HelpText<"Compile common globals like normal definitions">;

diff  --git a/clang/test/Driver/objc-constant-literals.m 
b/clang/test/Driver/objc-constant-literals.m
index 7903028d00541..aec39918d5feb 100644
--- a/clang/test/Driver/objc-constant-literals.m
+++ b/clang/test/Driver/objc-constant-literals.m
@@ -19,3 +19,32 @@
 // DISABLED-NOT: -fconstant-nsnumber-literals
 // DISABLED-NOT: -fconstant-nsarray-literals
 // DISABLED-NOT: -fconstant-nsdictionary-literals
+
+// The constant literal flags are Objective-C only. A build system may still
+// pass them uniformly to non-ObjC inputs (e.g. assembly files via a shared
+// response file); they carry NoArgumentUnused so they don't trigger
+// -Wunused-command-line-argument under -Werror.
+// RUN: %clang -target arm64-apple-macosx11 -Werror \
+// RUN:   -fobjc-constant-literals -fconstant-nsnumber-literals \
+// RUN:   -fconstant-nsarray-literals -fconstant-nsdictionary-literals \
+// RUN:   -x assembler -c %s -o /dev/null 2>&1 \
+// RUN:   | FileCheck %s --check-prefix=IGNORED --allow-empty
+// RUN: %clang -target arm64-apple-macosx11 -Werror \
+// RUN:   -fno-objc-constant-literals -fno-constant-nsnumber-literals \
+// RUN:   -fno-constant-nsarray-literals -fno-constant-nsdictionary-literals \
+// RUN:   -x assembler -c %s -o /dev/null 2>&1 \
+// RUN:   | FileCheck %s --check-prefix=IGNORED --allow-empty
+
+// IGNORED-NOT: argument unused during compilation
+// IGNORED-NOT: -fobjc-constant-literals
+// IGNORED-NOT: -fconstant-nsnumber-literals
+// IGNORED-NOT: -fconstant-nsarray-literals
+// IGNORED-NOT: -fconstant-nsdictionary-literals
+
+// The same flags must also be ignored (and not forwarded to cc1) when 
compiling
+// non-ObjC C/C++ inputs.
+// RUN: %clang -target arm64-apple-macosx11 -Werror \
+// RUN:   -fobjc-constant-literals -fconstant-nsnumber-literals \
+// RUN:   -fconstant-nsarray-literals -fconstant-nsdictionary-literals \
+// RUN:   -x c++ -c %s -o /dev/null 2>&1 \
+// RUN:   | FileCheck %s --check-prefix=IGNORED --allow-empty


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to