зеркало из https://github.com/microsoft/clang-1.git
Attempt to resolve overloaded functions in comma expressions and
conditional operators. Fixes PR7863. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@118631 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
df81c2c6ce
Коммит
7ad5d421d9
|
@ -4309,6 +4309,21 @@ ExprResult Sema::ActOnParenOrParenListExpr(SourceLocation L,
|
|||
QualType Sema::CheckConditionalOperands(Expr *&Cond, Expr *&LHS, Expr *&RHS,
|
||||
Expr *&SAVE,
|
||||
SourceLocation QuestionLoc) {
|
||||
// If both LHS and RHS are overloaded functions, try to resolve them.
|
||||
if (Context.hasSameType(LHS->getType(), RHS->getType()) &&
|
||||
LHS->getType()->isSpecificBuiltinType(BuiltinType::Overload)) {
|
||||
ExprResult LHSResult = CheckPlaceholderExpr(LHS, QuestionLoc);
|
||||
if (LHSResult.isInvalid())
|
||||
return QualType();
|
||||
|
||||
ExprResult RHSResult = CheckPlaceholderExpr(RHS, QuestionLoc);
|
||||
if (RHSResult.isInvalid())
|
||||
return QualType();
|
||||
|
||||
LHS = LHSResult.take();
|
||||
RHS = RHSResult.take();
|
||||
}
|
||||
|
||||
// C++ is sufficiently different to merit its own checker.
|
||||
if (getLangOptions().CPlusPlus)
|
||||
return CXXCheckConditionalOperands(Cond, LHS, RHS, SAVE, QuestionLoc);
|
||||
|
@ -6250,6 +6265,15 @@ QualType Sema::CheckAssignmentOperands(Expr *LHS, Expr *&RHS,
|
|||
QualType Sema::CheckCommaOperands(Expr *LHS, Expr *&RHS, SourceLocation Loc) {
|
||||
DiagnoseUnusedExprResult(LHS);
|
||||
|
||||
ExprResult LHSResult = CheckPlaceholderExpr(LHS, Loc);
|
||||
if (LHSResult.isInvalid())
|
||||
return QualType();
|
||||
|
||||
ExprResult RHSResult = CheckPlaceholderExpr(RHS, Loc);
|
||||
if (RHSResult.isInvalid())
|
||||
return QualType();
|
||||
RHS = RHSResult.take();
|
||||
|
||||
// C's comma performs lvalue conversion (C99 6.3.2.1) on both its
|
||||
// operands, but not unary promotions.
|
||||
// C++'s comma does not do any conversions at all (C++ [expr.comma]p1).
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||
|
||||
int ovl(int);
|
||||
float ovl(float);
|
||||
|
||||
template<typename T> T ovl(T);
|
||||
|
||||
void test(bool b) {
|
||||
(void)((void)0, ovl); // expected-error{{cannot resolve overloaded function from context}}
|
||||
// PR7863
|
||||
(void)(b? ovl : &ovl); // expected-error{{cannot resolve overloaded function from context}}
|
||||
(void)(b? ovl<float> : &ovl); // expected-error{{cannot resolve overloaded function from context}}
|
||||
(void)(b? ovl<float> : ovl<float>);
|
||||
}
|
Загрузка…
Ссылка в новой задаче