- This distinguishes between whether a function has constexpr specified and if a function is implicitly constexpr (implicitly inline).
- This also gives the ability to mark a function concept as implicitly constexpr (and implicitly inline)
How is the inline property transmitted here? Why does the setImplicitlyConstexpr function need to call setImplicitlyInline?
The quote does not seem to be pertinent here. Maybe have it a few lines down?
I am quite sure this is not the right thing to do when IC is false.
The parenthetical here seems to be no longer needed.
This reads wrong to me. I get that the idea is that the function should not be semantically considered constexpr, but the choice of setImplicitlyConstexpr seems odd.
This does not strike me as being very portable (I may be mistaken about how clang -cc1 works though). I think it would be much safer to use char  here (and in general for the size matching).
inline isn't really transmitted here. When we create a FunctionDecl in CreateNewFunctionDecl we could use this rather than passing isConstexpr as a parameter to the constructor. setImplicitlyConstexpr is intended to be used downstream such as in ActOnFunctionDeclarator or CheckExplicitlyDefaultedSpecialMember.
Sorry, can you point to where you're thinking below?
Good point. I could do if (IC) setImplicitlyInline();, but that doesn't seem great with these smaller functions. Any suggestions by you or @rsmith would be great!
I'll remove it.
Hmm, I'm not sure if we should keep around setConstexpr to handle cases either... Do you or @rsmith have any opinion?
Yeah, good point. I'll fix this.
Doing something automatic here with the inline specifier is turning out to be too complex. Instead, let's just remove the setImplicitlyInline() call from here and call it explicitly when handling a concept.