[PATCH] D28889: Change where we handle arg-dependent diagnose_if attributes
Richard Smith via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Jan 27 14:08:52 PST 2017
rsmith added a comment.
Another "fun" testcase:
struct S {
void operator++(int n) _diagnose_if(n, "wat", "warning");
};
void f(S s) {
s++; // no warning
s.operator++(1); // warning
}
================
Comment at: include/clang/Sema/Sema.h:2638
- /// Check the diagnose_if attributes on the given function. Returns the
- /// first succesful fatal attribute, or null if calling Function(Args) isn't
- /// an error.
+ /// Emit diagnostics for the diagnose_if attributes on Function, ignoring any
+ /// non-ArgDependent DiagnoseIfAttrs.
----------------
Can you add a comment somewhere about here explaining why these functions are split? Something like "Argument-dependent diagnose_if attributes are checked when the function is used as a direct callee of a function call." here, and "Argument-independent diagnose_if attributes are checked on every use of the function." below.
================
Comment at: include/clang/Sema/Sema.h:9925
SourceLocation Loc, SourceRange Range,
- VariadicCallType CallType);
+ VariadicCallType CallType, const Expr *ThisArg);
----------------
We have a loose convention that function parameter argument order matches source order, which would suggest that `ThisArg` should precede `Args` here.
================
Comment at: lib/Sema/SemaExprCXX.cpp:6717
+
+ checkDiagnoseIfAttrsOnCall(Method, CE);
return CE;
----------------
Can you call `CheckFunctionCall` instead here, and remove `checkDiagnoseIfAttrsOnCall`? It looks like the only reason we don't already call that is because none of its checks could ever fire for a call to a conversion function before, and that's no longer true.
================
Comment at: lib/Sema/SemaOverload.cpp:12035
+ checkDiagnoseIfAttrsOnCall(FnDecl, TheCall);
return MaybeBindToTemporary(TheCall);
----------------
Likewise call `CheckFunctionCall` here.
================
Comment at: lib/Sema/SemaOverload.cpp:12488
+ checkDiagnoseIfAttrsOnCall(Method, TheCall);
return MaybeBindToTemporary(TheCall);
----------------
... and here.
================
Comment at: lib/Sema/SemaOverload.cpp:13228
+ checkDiagnoseIfAttrsOnCall(Method, TheCall);
return MaybeBindToTemporary(TheCall);
----------------
... and here.
================
Comment at: test/SemaCXX/diagnose_if.cpp:614
+ // FIXME: This should emit diagnostics. It seems that our constexpr
+ // evaluator isn't able to evaluate `adl::Foo(1)` to a constexpr, though.
+ // I'm assuming this is because we assign it to a temporary.
----------------
`constexpr` is an adjective; "to a constant" might make more sense.
================
Comment at: test/SemaCXX/diagnose_if.cpp:615
+ // evaluator isn't able to evaluate `adl::Foo(1)` to a constexpr, though.
+ // I'm assuming this is because we assign it to a temporary.
+ for (void *p : adl::Foo(1)) {}
----------------
The range-based for is desugared to
```
auto &&__range = adl::Foo(1);
auto __begin = begin(__range);
auto __end = end(__range);
// ...
```
so the argument in the call to `begin` is not considered constant.
https://reviews.llvm.org/D28889
More information about the cfe-commits
mailing list