зеркало из https://github.com/microsoft/clang.git
Fix a crash when a pointer-to-member function is called in the condition
expression of '?:'. Add a test case for this pattern, and also test the code that led to the crash in a "working" case as well. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@133523 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
03e8003051
Коммит
14d251cd62
|
@ -2045,7 +2045,7 @@ Expr *Expr::IgnoreParenImpCasts() {
|
||||||
|
|
||||||
Expr *Expr::IgnoreConversionOperator() {
|
Expr *Expr::IgnoreConversionOperator() {
|
||||||
if (CXXMemberCallExpr *MCE = dyn_cast<CXXMemberCallExpr>(this)) {
|
if (CXXMemberCallExpr *MCE = dyn_cast<CXXMemberCallExpr>(this)) {
|
||||||
if (isa<CXXConversionDecl>(MCE->getMethodDecl()))
|
if (MCE->getMethodDecl() && isa<CXXConversionDecl>(MCE->getMethodDecl()))
|
||||||
return MCE->getImplicitObjectArgument();
|
return MCE->getImplicitObjectArgument();
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
|
|
|
@ -29,3 +29,17 @@ void f(Stream& s, bool b) {
|
||||||
// expected-note {{place parentheses around the '?:' expression to evaluate it first}} \
|
// expected-note {{place parentheses around the '?:' expression to evaluate it first}} \
|
||||||
// expected-note {{place parentheses around the '<<' expression to silence this warning}}
|
// expected-note {{place parentheses around the '<<' expression to silence this warning}}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct S {
|
||||||
|
operator int() { return 42; }
|
||||||
|
friend S operator+(const S &lhs, bool) { return S(); }
|
||||||
|
};
|
||||||
|
|
||||||
|
void test(S *s, bool (S::*m_ptr)()) {
|
||||||
|
(void)(*s + true ? "foo" : "bar"); // expected-warning {{operator '?:' has lower precedence than '+'}} \
|
||||||
|
// expected-note {{place parentheses around the '?:' expression to evaluate it first}} \
|
||||||
|
// expected-note {{place parentheses around the '+' expression to silence this warning}}
|
||||||
|
|
||||||
|
// Don't crash on unusual member call expressions.
|
||||||
|
(void)((s->*m_ptr)() ? "foo" : "bar");
|
||||||
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче