forked from OSchip/llvm-project
[XRay][clang] Support capturing the implicit `this` argument to C++ class member functions
Summary: Before this change, we couldn't capture the `this` pointer that's implicitly the first argument of class member functions. There are some interesting things we can do with capturing even just this single argument for zero-argument member functions. Reviewers: rnk, pelikan Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D34052 llvm-svn: 305544
This commit is contained in:
parent
6e13ff33c8
commit
7456a281dd
|
@ -313,8 +313,8 @@ static bool checkAttrMutualExclusion(Sema &S, Decl *D, SourceRange Range,
|
|||
/// \returns true if IdxExpr is a valid index.
|
||||
template <typename AttrInfo>
|
||||
static bool checkFunctionOrMethodParameterIndex(
|
||||
Sema &S, const Decl *D, const AttrInfo& Attr,
|
||||
unsigned AttrArgNum, const Expr *IdxExpr, uint64_t &Idx) {
|
||||
Sema &S, const Decl *D, const AttrInfo &Attr, unsigned AttrArgNum,
|
||||
const Expr *IdxExpr, uint64_t &Idx, bool AllowImplicitThis = false) {
|
||||
assert(isFunctionOrMethodOrBlock(D));
|
||||
|
||||
// In C++ the implicit 'this' function parameter also counts.
|
||||
|
@ -341,7 +341,7 @@ static bool checkFunctionOrMethodParameterIndex(
|
|||
return false;
|
||||
}
|
||||
Idx--; // Convert to zero-based.
|
||||
if (HasImplicitThisParam) {
|
||||
if (HasImplicitThisParam && !AllowImplicitThis) {
|
||||
if (Idx == 0) {
|
||||
S.Diag(getAttrLoc(Attr),
|
||||
diag::err_attribute_invalid_implicit_this_argument)
|
||||
|
@ -4604,8 +4604,10 @@ static void handleTypeTagForDatatypeAttr(Sema &S, Decl *D,
|
|||
static void handleXRayLogArgsAttr(Sema &S, Decl *D,
|
||||
const AttributeList &Attr) {
|
||||
uint64_t ArgCount;
|
||||
|
||||
if (!checkFunctionOrMethodParameterIndex(S, D, Attr, 1, Attr.getArgAsExpr(0),
|
||||
ArgCount))
|
||||
ArgCount,
|
||||
true /* AllowImplicitThis*/))
|
||||
return;
|
||||
|
||||
// ArgCount isn't a parameter index [0;n), it's a count [1;n] - hence + 1.
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
// RUN: %clang_cc1 %s -verify -fsyntax-only -std=c++11 -x c++
|
||||
|
||||
class Class {
|
||||
[[clang::xray_always_instrument, clang::xray_log_args(1)]] void Method();
|
||||
[[clang::xray_log_args(-1)]] void Invalid(); // expected-error {{'xray_log_args' attribute parameter 1 is out of bounds}}
|
||||
[[clang::xray_log_args("invalid")]] void InvalidStringArg(); // expected-error {{'xray_log_args'}}
|
||||
};
|
Loading…
Reference in New Issue