The code below, is it ill-formed NDR or is it well formed? Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 23, 2019 at 00:00UTC (8:00pm US/Eastern) Data science time! April 2019 and salary with experience The Ask Question Wizard is Live!Inheriting constructorsWhy does an overridden function in the derived class hide other overloads of the base class?x[0] == 1 constant expression in C++11 when x is const int[]?constexpr bug in clang but not in gcc?Rationale for [dcl.constexpr]p5 in the c++ standardWhy can't lambda, when cast to function pointer, be used in constexpr context?Ill-Formed, No Diagnostic Required (NDR): ConstExpr Function Throw in C++14constexpr reference to non-const objectWhy is this constexpr function ill-formed?Constexpr constructor fails to satisfy the requirements, but still constexpr. Why?

Crossing US/Canada Border for less than 24 hours

As a beginner, should I get a Squier Strat with a SSS config or a HSS?

How to compare two different files line by line in unix?

What was the first language to use conditional keywords?

Is there any word for a place full of confusion?

Why wasn't DOSKEY integrated with COMMAND.COM?

How do living politicians protect their readily obtainable signatures from misuse?

Why does the remaining Rebel fleet at the end of Rogue One seem dramatically larger than the one in A New Hope?

Did Krishna say in Bhagavad Gita "I am in every living being"

What is the appropriate index architecture when forced to implement IsDeleted (soft deletes)?

Export Xpubkey from Bitcoin Core

Why do we bend a book to keep it straight?

What initially awakened the Balrog?

Find 108 by using 3,4,6

How do I find out the mythology and history of my Fortress?

Illegal assignment from sObject to Id

How would a mousetrap for use in space work?

Can a new player join a group only when a new campaign starts?

Why is it faster to reheat something than it is to cook it?

Should I follow up with an employee I believe overracted to a mistake I made?

Is grep documentation about ignoring case wrong, since it doesn't ignore case in filenames?

An adverb for when you're not exaggerating

Has negative voting ever been officially implemented in elections, or seriously proposed, or even studied?

Selecting user stories during sprint planning



The code below, is it ill-formed NDR or is it well formed?



Announcing the arrival of Valued Associate #679: Cesar Manara
Planned maintenance scheduled April 23, 2019 at 00:00UTC (8:00pm US/Eastern)
Data science time! April 2019 and salary with experience
The Ask Question Wizard is Live!Inheriting constructorsWhy does an overridden function in the derived class hide other overloads of the base class?x[0] == 1 constant expression in C++11 when x is const int[]?constexpr bug in clang but not in gcc?Rationale for [dcl.constexpr]p5 in the c++ standardWhy can't lambda, when cast to function pointer, be used in constexpr context?Ill-Formed, No Diagnostic Required (NDR): ConstExpr Function Throw in C++14constexpr reference to non-const objectWhy is this constexpr function ill-formed?Constexpr constructor fails to satisfy the requirements, but still constexpr. Why?



.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;








13















Clang accepts the following code, but gcc rejects it.



void h() 

constexpr int f()
return 1;
h();


int main()
constexpr int i = f();



Here is the error message:



g++ -std=c++17 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
main.cpp: In function 'constexpr int f()':
main.cpp:5:6: error: call to non-'constexpr' function 'void h()'
h();
~^~
main.cpp: In function 'int main()':
main.cpp:9:24: error: 'constexpr int f()' called in a constant expression
constexpr int i = f();
~^~
main.cpp:9:19: warning: unused variable 'i' [-Wunused-variable]
constexpr int i = f();


This could well be the case where both compilers are correct, once we consider [dcl.constexpr]/5, given that f() is not a constant expression, as it doesn't satisfy [expr.const]/(4.2), as it calls a non-constexpr function h. That is, the code is ill-formed, but no diagnostic is required.



One other possibility is that the code is well formed, as [expr.const]/(4.2) doesn't apply in this case because the call to h in f is not evaluated. If this is the case, gcc is wrong and clang is correct.










share|improve this question



















  • 3





    Clang does not allow calling h() before returning, so the real question here is: Is a compiler allowed to ignore dead ill-formed code?

    – idmean
    1 hour ago











  • "as it calls a non-constexpr function h". But it doesn't actually call h. I'd say that gcc is wrong here.

    – geza
    1 hour ago











  • I'm adding the C++14 tag since on C++11 there's no question that it's ill-formed.

    – Barry
    56 mins ago











  • This code works in GCC's trunk.. godbolt.org/z/f04MCq and godbolt.org/z/bAyE8a .. So it's already fixed.. Free upvotes. If compiled with GCC 8.3 it will fail but compile with Trunk and it works fine.

    – Brandon
    53 mins ago


















13















Clang accepts the following code, but gcc rejects it.



void h() 

constexpr int f()
return 1;
h();


int main()
constexpr int i = f();



Here is the error message:



g++ -std=c++17 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
main.cpp: In function 'constexpr int f()':
main.cpp:5:6: error: call to non-'constexpr' function 'void h()'
h();
~^~
main.cpp: In function 'int main()':
main.cpp:9:24: error: 'constexpr int f()' called in a constant expression
constexpr int i = f();
~^~
main.cpp:9:19: warning: unused variable 'i' [-Wunused-variable]
constexpr int i = f();


This could well be the case where both compilers are correct, once we consider [dcl.constexpr]/5, given that f() is not a constant expression, as it doesn't satisfy [expr.const]/(4.2), as it calls a non-constexpr function h. That is, the code is ill-formed, but no diagnostic is required.



One other possibility is that the code is well formed, as [expr.const]/(4.2) doesn't apply in this case because the call to h in f is not evaluated. If this is the case, gcc is wrong and clang is correct.










share|improve this question



















  • 3





    Clang does not allow calling h() before returning, so the real question here is: Is a compiler allowed to ignore dead ill-formed code?

    – idmean
    1 hour ago











  • "as it calls a non-constexpr function h". But it doesn't actually call h. I'd say that gcc is wrong here.

    – geza
    1 hour ago











  • I'm adding the C++14 tag since on C++11 there's no question that it's ill-formed.

    – Barry
    56 mins ago











  • This code works in GCC's trunk.. godbolt.org/z/f04MCq and godbolt.org/z/bAyE8a .. So it's already fixed.. Free upvotes. If compiled with GCC 8.3 it will fail but compile with Trunk and it works fine.

    – Brandon
    53 mins ago














13












13








13


1






Clang accepts the following code, but gcc rejects it.



void h() 

constexpr int f()
return 1;
h();


int main()
constexpr int i = f();



Here is the error message:



g++ -std=c++17 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
main.cpp: In function 'constexpr int f()':
main.cpp:5:6: error: call to non-'constexpr' function 'void h()'
h();
~^~
main.cpp: In function 'int main()':
main.cpp:9:24: error: 'constexpr int f()' called in a constant expression
constexpr int i = f();
~^~
main.cpp:9:19: warning: unused variable 'i' [-Wunused-variable]
constexpr int i = f();


This could well be the case where both compilers are correct, once we consider [dcl.constexpr]/5, given that f() is not a constant expression, as it doesn't satisfy [expr.const]/(4.2), as it calls a non-constexpr function h. That is, the code is ill-formed, but no diagnostic is required.



One other possibility is that the code is well formed, as [expr.const]/(4.2) doesn't apply in this case because the call to h in f is not evaluated. If this is the case, gcc is wrong and clang is correct.










share|improve this question
















Clang accepts the following code, but gcc rejects it.



void h() 

constexpr int f()
return 1;
h();


int main()
constexpr int i = f();



Here is the error message:



g++ -std=c++17 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
main.cpp: In function 'constexpr int f()':
main.cpp:5:6: error: call to non-'constexpr' function 'void h()'
h();
~^~
main.cpp: In function 'int main()':
main.cpp:9:24: error: 'constexpr int f()' called in a constant expression
constexpr int i = f();
~^~
main.cpp:9:19: warning: unused variable 'i' [-Wunused-variable]
constexpr int i = f();


This could well be the case where both compilers are correct, once we consider [dcl.constexpr]/5, given that f() is not a constant expression, as it doesn't satisfy [expr.const]/(4.2), as it calls a non-constexpr function h. That is, the code is ill-formed, but no diagnostic is required.



One other possibility is that the code is well formed, as [expr.const]/(4.2) doesn't apply in this case because the call to h in f is not evaluated. If this is the case, gcc is wrong and clang is correct.







c++ language-lawyer c++17 constexpr






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 55 mins ago









Barry

187k21331612




187k21331612










asked 1 hour ago









AlexanderAlexander

895414




895414







  • 3





    Clang does not allow calling h() before returning, so the real question here is: Is a compiler allowed to ignore dead ill-formed code?

    – idmean
    1 hour ago











  • "as it calls a non-constexpr function h". But it doesn't actually call h. I'd say that gcc is wrong here.

    – geza
    1 hour ago











  • I'm adding the C++14 tag since on C++11 there's no question that it's ill-formed.

    – Barry
    56 mins ago











  • This code works in GCC's trunk.. godbolt.org/z/f04MCq and godbolt.org/z/bAyE8a .. So it's already fixed.. Free upvotes. If compiled with GCC 8.3 it will fail but compile with Trunk and it works fine.

    – Brandon
    53 mins ago













  • 3





    Clang does not allow calling h() before returning, so the real question here is: Is a compiler allowed to ignore dead ill-formed code?

    – idmean
    1 hour ago











  • "as it calls a non-constexpr function h". But it doesn't actually call h. I'd say that gcc is wrong here.

    – geza
    1 hour ago











  • I'm adding the C++14 tag since on C++11 there's no question that it's ill-formed.

    – Barry
    56 mins ago











  • This code works in GCC's trunk.. godbolt.org/z/f04MCq and godbolt.org/z/bAyE8a .. So it's already fixed.. Free upvotes. If compiled with GCC 8.3 it will fail but compile with Trunk and it works fine.

    – Brandon
    53 mins ago








3




3





Clang does not allow calling h() before returning, so the real question here is: Is a compiler allowed to ignore dead ill-formed code?

– idmean
1 hour ago





Clang does not allow calling h() before returning, so the real question here is: Is a compiler allowed to ignore dead ill-formed code?

– idmean
1 hour ago













"as it calls a non-constexpr function h". But it doesn't actually call h. I'd say that gcc is wrong here.

– geza
1 hour ago





"as it calls a non-constexpr function h". But it doesn't actually call h. I'd say that gcc is wrong here.

– geza
1 hour ago













I'm adding the C++14 tag since on C++11 there's no question that it's ill-formed.

– Barry
56 mins ago





I'm adding the C++14 tag since on C++11 there's no question that it's ill-formed.

– Barry
56 mins ago













This code works in GCC's trunk.. godbolt.org/z/f04MCq and godbolt.org/z/bAyE8a .. So it's already fixed.. Free upvotes. If compiled with GCC 8.3 it will fail but compile with Trunk and it works fine.

– Brandon
53 mins ago






This code works in GCC's trunk.. godbolt.org/z/f04MCq and godbolt.org/z/bAyE8a .. So it's already fixed.. Free upvotes. If compiled with GCC 8.3 it will fail but compile with Trunk and it works fine.

– Brandon
53 mins ago













1 Answer
1






active

oldest

votes


















12














Clang is correct. A call to f() is a constant expression since the call to h() is never evaluated, so [dcl.constexpr]/5 doesn't apply. The call to h() in the body of f() is not ill-formed because the constraints on constexpr functions don't say anything about not being allowed to call non-constexpr functions. Indeed, a function like the following is well-formed because a call to it can be a constant expression when x is odd:



constexpr int g(int x) 
if (x%2 == 0) h();
return 0;






share|improve this answer























    Your Answer






    StackExchange.ifUsing("editor", function ()
    StackExchange.using("externalEditor", function ()
    StackExchange.using("snippets", function ()
    StackExchange.snippets.init();
    );
    );
    , "code-snippets");

    StackExchange.ready(function()
    var channelOptions =
    tags: "".split(" "),
    id: "1"
    ;
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function()
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled)
    StackExchange.using("snippets", function()
    createEditor();
    );

    else
    createEditor();

    );

    function createEditor()
    StackExchange.prepareEditor(
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader:
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    ,
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    );



    );













    draft saved

    draft discarded


















    StackExchange.ready(
    function ()
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55752281%2fthe-code-below-is-it-ill-formed-ndr-or-is-it-well-formed%23new-answer', 'question_page');

    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    12














    Clang is correct. A call to f() is a constant expression since the call to h() is never evaluated, so [dcl.constexpr]/5 doesn't apply. The call to h() in the body of f() is not ill-formed because the constraints on constexpr functions don't say anything about not being allowed to call non-constexpr functions. Indeed, a function like the following is well-formed because a call to it can be a constant expression when x is odd:



    constexpr int g(int x) 
    if (x%2 == 0) h();
    return 0;






    share|improve this answer



























      12














      Clang is correct. A call to f() is a constant expression since the call to h() is never evaluated, so [dcl.constexpr]/5 doesn't apply. The call to h() in the body of f() is not ill-formed because the constraints on constexpr functions don't say anything about not being allowed to call non-constexpr functions. Indeed, a function like the following is well-formed because a call to it can be a constant expression when x is odd:



      constexpr int g(int x) 
      if (x%2 == 0) h();
      return 0;






      share|improve this answer

























        12












        12








        12







        Clang is correct. A call to f() is a constant expression since the call to h() is never evaluated, so [dcl.constexpr]/5 doesn't apply. The call to h() in the body of f() is not ill-formed because the constraints on constexpr functions don't say anything about not being allowed to call non-constexpr functions. Indeed, a function like the following is well-formed because a call to it can be a constant expression when x is odd:



        constexpr int g(int x) 
        if (x%2 == 0) h();
        return 0;






        share|improve this answer













        Clang is correct. A call to f() is a constant expression since the call to h() is never evaluated, so [dcl.constexpr]/5 doesn't apply. The call to h() in the body of f() is not ill-formed because the constraints on constexpr functions don't say anything about not being allowed to call non-constexpr functions. Indeed, a function like the following is well-formed because a call to it can be a constant expression when x is odd:



        constexpr int g(int x) 
        if (x%2 == 0) h();
        return 0;







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered 1 hour ago









        BrianBrian

        67k799192




        67k799192





























            draft saved

            draft discarded
















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid


            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.

            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55752281%2fthe-code-below-is-it-ill-formed-ndr-or-is-it-well-formed%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Era Viking Índice Início da Era Viquingue | Cotidiano | Sociedade | Língua | Religião | A arte | As primeiras cidades | As viagens dos viquingues | Viquingues do Oeste e Leste | Fim da Era Viquingue | Fontes históricas | Referências Bibliografia | Ligações externas | Menu de navegação«Sverige då!»«Handel I vikingetid»«O que é Nórdico Antigo»Mito, magia e religião na volsunga saga Um olhar sobre a trajetória mítica do herói sigurd«Bonden var den verklige vikingen»«Vikingatiden»«Vikingatiden»«Vinland»«Guerreiras de Óðinn: As Valkyrjor na Mitologia Viking»1519-9053«Esculpindo símbolos e seres: A arte viking em pedras rúnicas»1679-9313Historia - Tema: VikingarnaAventura e Magia no Mundo das Sagas IslandesasEra Vikinge

            What's the metal clinking sound at the end of credits in Avengers: Endgame?What makes Thanos so strong in Avengers: Endgame?Who is the character that appears at the end of Endgame?What happens to Mjolnir (Thor's hammer) at the end of Endgame?The People's Ages in Avengers: EndgameWhat did Nebula do in Avengers: Endgame?Messing with time in the Avengers: Endgame climaxAvengers: Endgame timelineWhat are the time-travel rules in Avengers Endgame?Why use this song in Avengers: Endgame Opening Logo Sequence?Peggy's age in Avengers Endgame

            Are there legal definitions of ethnicities/races? The 2019 Stack Overflow Developer Survey Results Are In Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern)Legal definitions in the United StatesAre there truly legal limits on US interest rates?Are gender identity and sexual orientation federally protected?Why is there an apparent legal bias against digital services?What limits are there to the powers of individual judges in the United States legal system?Are women only scholarships legal under Irish / EU law?Is the term “race” defined by Public Law enacted by Congress of the United StatesIs there a legal definition of race in the US?Neighbors are spying for landlord on Renters is it legal?Are Protected Classes Bi-directional?