Let's try the other Richard, since Mr. Smith is in Chicago.
On Fri, Sep 20, 2013 at 4:50 PM, Reid Kleckner <[email protected]> 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@+3 {{enumerator value converted to underlying type > 'int' with opposite sign}} > + // expected-warning@+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 ) { >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
