jroelofs added inline comments. ================ Comment at: include/clang/Basic/DiagnosticSemaKinds.td:6807 @@ +6806,3 @@ + +def err_has_constant_init_expression_trait_invalid_arg : Error< + "expression does not reference a named variable">; ---------------- EricWF wrote: > Help improving this wording would be appreciated. `"expression must be a named variable"`, maybe?
A "counterexample" to the original wording is `__has_constant_initializer(x+1)`. ================ Comment at: lib/Sema/SemaExprCXX.cpp:4775 @@ +4774,3 @@ + // a 'constant initializer'. + else if ((VD->hasGlobalStorage() || + VD->getTLSKind() != VarDecl::TLS_None) && VD->hasInit()) { ---------------- EricWF wrote: > EricWF wrote: > > jroelofs wrote: > > > no else after return. > > > > > > Also, what do you want this to do for `ParmVarDecl`s that happen to have > > > an initializer? i.e: > > > > > > ``` > > > void foo(int i = 45) {} > > > ``` > > I believe that case should return false. `i` isn't static or thread local > > so it doesn't have a "constant initializer" according to > > [basic.start.static]. > > > Perhaps using `__has_constant_initializer` should emit a diagnostic when used > on non-static, non-thread-local objects? //Maybe// a warning... And you might want it to behave differently when it comes from a macro expansion. I'm not sure what the norm is for that sort of thing though. I think the more important thing at this point is to precisely document what you want the behavior to be in the docs. Then any difference from that spec is "just a compiler bug", rather than potentially being a breaking change in behavior for someone who used your API in a way that you didn't expect. https://reviews.llvm.org/D23385 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits