================ @@ -9237,6 +9282,22 @@ static FunctionDecl *CreateNewFunctionDecl(Sema &SemaRef, Declarator &D, FunctionDecl *NewFD = nullptr; bool isInline = D.getDeclSpec().isInlineSpecified(); + ConstexprSpecKind ConstexprKind = D.getDeclSpec().getConstexprSpecifier(); + if (ConstexprKind == ConstexprSpecKind::Constinit || + (SemaRef.getLangOpts().C23 && + ConstexprKind == ConstexprSpecKind::Constexpr)) { + + if (SemaRef.getLangOpts().C23) + SemaRef.Diag(D.getDeclSpec().getConstexprSpecLoc(), + diag::err_c23_constexpr_not_variable); ---------------- AaronBallman wrote:
> > Hmmm, I'm not certain we need to change anything here > > Well, without that move for C we silently create `FunctionDecl` and exit > whether it has `constexpr` specifier or not. > > > it would be more clear to say that a function cannot be constexpr in C > > instead of saying you declared something constexpr that isn't a variable. > > WDYT? > > I don't seem to have a problem with this particular message, for C++ similar > invalid use cases clang says and does the same. But If that will help users, > ok. I also use `err_c23_constexpr_not_variable` message when diagnosing > constexpr applied to a type declaration. Should I add more specific message > for this case as well? Sorry, I meant that your changes here might be fine as-is, not that no changes were needed here. > I also use `err_c23_constexpr_not_variable` message when diagnosing constexpr > applied to a type declaration. Should I add more specific message for this > case as well? I'm thinking more that we should use `err_constexpr_wrong_decl_kind` in C as well (I had suggested that above). But perhaps that's painful because of `consteval` and `constinit` support in C++, so maybe it's best to ignore that suggestion here and above... https://github.com/llvm/llvm-project/pull/73099 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits