diff options
author | David Blaikie <dblaikie@gmail.com> | 2012-10-11 22:55:07 +0000 |
---|---|---|
committer | David Blaikie <dblaikie@gmail.com> | 2012-10-11 22:55:07 +0000 |
commit | abeadfb11fde148f15c2fd67015e8163609d5b68 (patch) | |
tree | 6cd6b61824c8e8b99b163823ffbb8ca5ea651461 | |
parent | 80eed72ed850d4d5ce49ad2a2c0971f260d8327f (diff) |
Provide a fixit when taking the address of an unqualified member function.
This only applies if the type has a name. (we could potentially do something
crazy with decltype in C++11 to qualify members of unnamed types but that
seems excessive)
It might be nice to also suggest a fixit for "&this->i", "&foo->i",
and "&foo.i" but those expressions produce 'bound' member functions that have
a different AST representation & make error recovery a little trickier. Left
as future work.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@165763 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaExpr.cpp | 12 | ||||
-rw-r--r-- | test/FixIt/fixit.cpp | 7 | ||||
-rw-r--r-- | test/FixIt/no-fixit.cpp | 6 |
3 files changed, 23 insertions, 2 deletions
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 669d8356f5..74ee870012 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -8056,8 +8056,16 @@ static QualType CheckAddressOfOperand(Sema &S, ExprResult &OrigOp, // The method was named without a qualifier. } else if (!DRE->getQualifier()) { - S.Diag(OpLoc, diag::err_unqualified_pointer_member_function) - << op->getSourceRange(); + if (MD->getParent()->getName().empty()) + S.Diag(OpLoc, diag::err_unqualified_pointer_member_function) + << op->getSourceRange(); + else { + SmallString<32> Str; + StringRef Qual = (MD->getParent()->getName() + "::").toStringRef(Str); + S.Diag(OpLoc, diag::err_unqualified_pointer_member_function) + << op->getSourceRange() + << FixItHint::CreateInsertion(op->getSourceRange().getBegin(), Qual); + } } return S.Context.getMemberPointerType(op->getType(), diff --git a/test/FixIt/fixit.cpp b/test/FixIt/fixit.cpp index dc0b6c8f2a..253abd0f4e 100644 --- a/test/FixIt/fixit.cpp +++ b/test/FixIt/fixit.cpp @@ -292,3 +292,10 @@ namespace greatergreater { //(void)(&t<S<int>>==p); } } + +class foo { + static void test() { + (void)&i; // expected-error{{must explicitly qualify name of member function when taking its address}} + } + int i(); +}; diff --git a/test/FixIt/no-fixit.cpp b/test/FixIt/no-fixit.cpp index c95c8670d6..9da29229f0 100644 --- a/test/FixIt/no-fixit.cpp +++ b/test/FixIt/no-fixit.cpp @@ -5,3 +5,9 @@ // CHECK-NOT: fix-it: template<template<typename> +> void func(); + +struct { + void i() { + (void)&i; + } +} x; |