[PATCH] Windows: Don't warn when making large unsigned enum values signed

Reid Kleckner rnk at google.com
Mon Sep 23 10:57:21 PDT 2013


Let's try the other Richard, since Mr. Smith is in Chicago.


On Fri, Sep 20, 2013 at 4:50 PM, Reid Kleckner <rnk at google.com> wrote:

> Hi rsmith,
>
> Introduces a new warning flag -Wmicrosoft-signed-enums to cover this
> which is off by default.
>
> This avoids many warnings across clang during a self-host with
> -fms-compatibility on constructs like 'enum { ~0U }'.  Enums in MSVC
> always use 'int' as the underlying type, unless you explicitly specify
> the integral type.
>
> http://llvm-reviews.chandlerc.com/D1736
>
> Files:
>   include/clang/Basic/DiagnosticGroups.td
>   include/clang/Basic/DiagnosticSemaKinds.td
>   lib/Sema/SemaDecl.cpp
>   test/Sema/MicrosoftCompatibility.c
>
> Index: include/clang/Basic/DiagnosticGroups.td
> ===================================================================
> --- include/clang/Basic/DiagnosticGroups.td
> +++ include/clang/Basic/DiagnosticGroups.td
> @@ -569,6 +569,7 @@
>
>  // A warning group for warnings about Microsoft extensions.
>  def Microsoft : DiagGroup<"microsoft">;
> +def MicrosoftSignedEnums : DiagGroup<"microsoft-signed-enums">;
>
>  def ObjCNonUnifiedException : DiagGroup<"objc-nonunified-exceptions">;
>
> Index: include/clang/Basic/DiagnosticSemaKinds.td
> ===================================================================
> --- include/clang/Basic/DiagnosticSemaKinds.td
> +++ include/clang/Basic/DiagnosticSemaKinds.td
> @@ -1570,6 +1570,9 @@
>  def ext_enumerator_too_large : ExtWarn<
>    "enumerator value is not representable in the underlying type %0">,
>    InGroup<Microsoft>;
> +def ext_enumerator_sign_mismatch : ExtWarn<
> +  "enumerator value converted to underlying type %0 with opposite sign">,
> +  InGroup<MicrosoftSignedEnums>, DefaultIgnore;
>  def err_enumerator_wrapped : Error<
>    "enumerator value %0 is not representable in the underlying type %1">;
>  def err_enum_redeclare_type_mismatch : Error<
> Index: lib/Sema/SemaDecl.cpp
> ===================================================================
> --- lib/Sema/SemaDecl.cpp
> +++ lib/Sema/SemaDecl.cpp
> @@ -12082,7 +12082,11 @@
>            // expression checking.
>            if (!isRepresentableIntegerValue(Context, EnumVal, EltTy)) {
>              if (getLangOpts().MicrosoftMode) {
> -              Diag(IdLoc, diag::ext_enumerator_too_large) << EltTy;
> +              QualType UEltTy =
> Context.getCorrespondingUnsignedType(EltTy);
> +              if (isRepresentableIntegerValue(Context, EnumVal, UEltTy))
> +                Diag(IdLoc, diag::ext_enumerator_sign_mismatch) << EltTy;
> +              else
> +                Diag(IdLoc, diag::ext_enumerator_too_large) << EltTy;
>                Val = ImpCastExprToType(Val, EltTy, CK_IntegralCast).take();
>              } else
>                Diag(IdLoc, diag::err_enumerator_too_large) << EltTy;
> Index: test/Sema/MicrosoftCompatibility.c
> ===================================================================
> --- test/Sema/MicrosoftCompatibility.c
> +++ test/Sema/MicrosoftCompatibility.c
> @@ -1,14 +1,20 @@
>  // RUN: %clang_cc1 %s -fsyntax-only -Wno-unused-value -Wmicrosoft -verify
> -fms-compatibility
> +// RUN: %clang_cc1 %s -fsyntax-only -Wno-unused-value -Wmicrosoft
> -Wmicrosoft-signed-enums -DWSIGNED_ENUMS -verify -fms-compatibility
>
>  enum ENUM1; // expected-warning {{forward references to 'enum' types are
> a Microsoft extension}}
>  enum ENUM1 var1 = 3;
>  enum ENUM1* var2 = 0;
>
>
>  enum ENUM2 {
>    ENUM2_a = (enum ENUM2) 4,
> -  ENUM2_b = 0x9FFFFFFF, // expected-warning {{enumerator value is not
> representable in the underlying type 'int'}}
> -  ENUM2_c = 0x100000000 // expected-warning {{enumerator value is not
> representable in the underlying type 'int'}}
> +#ifdef WSIGNED_ENUMS
> +  // expected-warning at +3 {{enumerator value converted to underlying type
> 'int' with opposite sign}}
> +  // expected-warning at +3 {{enumerator value converted to underlying type
> 'int' with opposite sign}}
> +#endif
> +  ENUM2_b = ~0U,
> +  ENUM2_c = 0x9FFFFFFF,
> +  ENUM2_d = 0x100000000 // expected-warning {{enumerator value is not
> representable in the underlying type 'int'}}
>  };
>
>  __declspec(noreturn) void f6( void ) {
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130923/4fd12346/attachment.html>


More information about the cfe-commits mailing list