diff options
author | John McCall <rjmccall@apple.com> | 2010-08-27 09:08:28 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2010-08-27 09:08:28 +0000 |
commit | 9c72c6088d591ace8503b842d39448c2040f3033 (patch) | |
tree | 8b1d32bd99da6262bfa80bb0176e4cafdbe21038 /lib/Sema/SemaOverload.cpp | |
parent | df1367af26cb2959775e9511108f12dcd2370a27 (diff) |
Propagate whether an id-expression is the immediate argument of
an '&' expression from the second caller of ActOnIdExpression.
Teach template argument deduction that an overloaded id-expression
doesn't give a valid type for deduction purposes to a non-static
member function unless the expression has the correct syntactic
form.
Teach ActOnIdExpression that it shouldn't try to create implicit
member expressions for '&function', because this isn't a
permitted form of use for member functions.
Teach CheckAddressOfOperand to diagnose these more carefully.
Some of these cases aren't reachable right now because earlier
diagnostics interrupt them.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@112258 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaOverload.cpp')
-rw-r--r-- | lib/Sema/SemaOverload.cpp | 18 |
1 files changed, 4 insertions, 14 deletions
diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index 95c03eb768..b5f1e528e4 100644 --- a/lib/Sema/SemaOverload.cpp +++ b/lib/Sema/SemaOverload.cpp @@ -6222,18 +6222,8 @@ Sema::ResolveAddressOfOverloadedFunction(Expr *From, QualType ToType, // A pointer to member is only formed when an explicit & is used // and its operand is a qualified-id not enclosed in // parentheses. - bool HasFormOfMemberPointer = false; - OverloadExpr *OvlExpr; - { - Expr *Tmp = From->IgnoreParens(); - if (isa<UnaryOperator>(Tmp)) { - Tmp = cast<UnaryOperator>(Tmp)->getSubExpr(); - OvlExpr = cast<OverloadExpr>(Tmp->IgnoreParens()); - HasFormOfMemberPointer = (Tmp == OvlExpr && OvlExpr->getQualifier()); - } else { - OvlExpr = cast<OverloadExpr>(Tmp); - } - } + OverloadExpr::FindResult Ovl = OverloadExpr::find(From); + OverloadExpr *OvlExpr = Ovl.Expression; // We expect a pointer or reference to function, or a function pointer. FunctionType = Context.getCanonicalType(FunctionType).getUnqualifiedType(); @@ -6247,7 +6237,7 @@ Sema::ResolveAddressOfOverloadedFunction(Expr *From, QualType ToType, // If the overload expression doesn't have the form of a pointer to // member, don't try to convert it to a pointer-to-member type. - if (IsMember && !HasFormOfMemberPointer) { + if (IsMember && !Ovl.HasFormOfMemberPointer) { if (!Complain) return 0; // TODO: Should we condition this on whether any functions might @@ -6453,7 +6443,7 @@ FunctionDecl *Sema::ResolveSingleFunctionTemplateSpecialization(Expr *From) { if (From->getType() != Context.OverloadTy) return 0; - OverloadExpr *OvlExpr = OverloadExpr::find(From).getPointer(); + OverloadExpr *OvlExpr = OverloadExpr::find(From).Expression; // If we didn't actually find any template-ids, we're done. if (!OvlExpr->hasExplicitTemplateArgs()) |