Skip to content

C4702: unreachable code #65

Closed
Closed

Description

@hanusek

Hello!
I have a problem:

C:\builds\eprotect-platfrom\auth\client\include\nonstd\expected.hpp(2142) : error C2220: the following warning is treated as an error
C:\builds\eprotect-platfrom\auth\client\include\nonstd\expected.hpp(2142) : warning C4702: unreachable code

OS: Windows 2022
Visual Studio 2022 v17.5.0

https://conan.io/center/recipes/expected-lite?version=0.6.3

Activity

  1. subbota-a commented on Mar 21, 2024

    @subbota-a

    Me too

  2. szaszm commented on Apr 23, 2024

    @szaszm
    Contributor

    How does that work? That line is a comment, there is no code there: https://github.com/martinmoene/expected-lite/blob/v0.6.3/include/nonstd/expected.hpp#L2142
    Is it any different in your build directory?

  3. np-c0mp1ete commented on May 22, 2024

    @np-c0mp1ete

    Hello!

    Repro:

    #include "expected.hpp"
    
    int main()
    {
        nonstd::expected<int, int> ei = 0;
        return ei.value();
    }
    

    Compile using cl /O2 /W4 /WX main.cpp. expected-lite version is 0.6.3.

    Output:

    Microsoft (R) C/C++ Optimizing Compiler Version 19.39.33523 for x64
    Copyright (C) Microsoft Corporation.  All rights reserved.
    
    main.cpp
    C:\test\expected.hpp(1803) : error C2220: the following warning is treated as an error
    C:\test\expected.hpp(1803) : warning C4702: unreachable code
    
  4. martinmoene commented on May 29, 2024

    @martinmoene
    Collaborator

    On Compiler Explorer:

    • MSVC v19.latest: -O2 -W4 -WX -Dnsel_CONFIG_SELECT_EXPECTED=nsel_EXPECTED_NONSTD: C4702: unreachable code.
    • clang 18.1.0: -O2 -Wall -Wunreachable-code-aggressive -Dnsel_CONFIG_SELECT_EXPECTED=nsel_EXPECTED_NONSTD: no warning.

    I'm not sure what to think of MSVC's warning.

  5. szaszm commented on May 29, 2024

    @szaszm
    Contributor

    Ah, at first I thought line 2142 is with the 0.6.3 release branch, but apparently it's on master, so there is actual code there. So the correct reference is

    Maybe MSVC doesn't like the value() call next to the comma operator after rethrow, which is actually unreachable. Maybe a random throw expression instead of value() call would silence it, but I can't test this now.

    A few other wrong ideas I had:

    • immediately invoked lambda that calls rethrow, and lies about its return type. That would produce another warning about the function not returning anything, because rethrow is not actually throwing.
    • changing rethrow to lie that its return type is value_type&. That would generate a similar warning inside rethrow, because it doesn't return that type, nor does it throw. assert and RaiseException look like normal function calls to the control flow analyzer.
    • change to an if statement. This wouldn't work with C++11 compilers in constexpr context.
  6. martinmoene commented on May 30, 2024

    @martinmoene
    Collaborator

    Thanks for your helpful thoughts to advance this issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions