[llvm-bugs] [Bug 30776] New: clang-cl error with -Wc++11-narrowing and enums on code that MSVC accepts

via llvm-bugs llvm-bugs at lists.llvm.org
Mon Oct 24 12:44:10 PDT 2016


https://llvm.org/bugs/show_bug.cgi?id=30776

            Bug ID: 30776
           Summary: clang-cl error with -Wc++11-narrowing and enums on
                    code that MSVC accepts
           Product: new-bugs
           Version: trunk
          Hardware: PC
                OS: Windows NT
            Status: NEW
          Severity: normal
          Priority: P
         Component: new bugs
          Assignee: unassignedbugs at nondot.org
          Reporter: froydnj at gmail.com
                CC: llvm-bugs at lists.llvm.org
    Classification: Unclassified

Compiling:

typedef enum {
  MD_EXCEPTION_CODE_WIN_FLOAT_INEXACT_RESULT = 0xc000008f,
} MDExceptionCodeWin;

extern void g();
extern void h();

void
f(unsigned int code)
{
  switch (code) {
  case MD_EXCEPTION_CODE_WIN_FLOAT_INEXACT_RESULT:
    g();
    break;
  default:
    h();
    break;
  }
}

gives:

$ clang-cl -c enum-switch.cpp
enum-switch.cpp(2,3):  warning: enumerator value is not representable in the
      underlying type 'int' [-Wmicrosoft-enum-value]
  MD_EXCEPTION_CODE_WIN_FLOAT_INEXACT_RESULT = 0xc000008f,
  ^
enum-switch.cpp(12,8):  error: case value evaluates to -1073741681, which
cannot

      be narrowed to type 'unsigned int' [-Wc++11-narrowing]
  case MD_EXCEPTION_CODE_WIN_FLOAT_INEXACT_RESULT:
       ^
1 warning and 1 error generated.

whereas MSVC accepts the code without complaint.

I am reasonably sure this used to work, and not error, but I have not bisected
this, and may have a faulty memory in any event.

I realize that this is similar to bug 25644, and arguably the code should be
fixed (perhaps by explicitly making the enum have an underlying type of
uint32_t), but that is less straightforward in this case.  The enum in question
may be in a header file that is shared between C/C++, and people may have,
shall we say, strong opinions about adding C++ goo.  It's also not clear to me
whether mixing and matching different enum definitions like that would do the
right thing when calling between C and C++ functions.

Thoughts?

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20161024/0e929597/attachment.html>


More information about the llvm-bugs mailing list