From: Chandler Carruth Date: Tue, 21 Jun 2011 17:22:09 +0000 (+0000) Subject: Fix a crash when a pointer-to-member function is called in the condition X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=14d251cd62942bf7d56bb87a267ba2ca2f7fae3e;p=clang 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 --- diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index 31972bdd23..1faceb9425 100644 --- a/lib/AST/Expr.cpp +++ b/lib/AST/Expr.cpp @@ -2045,7 +2045,7 @@ Expr *Expr::IgnoreParenImpCasts() { Expr *Expr::IgnoreConversionOperator() { if (CXXMemberCallExpr *MCE = dyn_cast(this)) { - if (isa(MCE->getMethodDecl())) + if (MCE->getMethodDecl() && isa(MCE->getMethodDecl())) return MCE->getImplicitObjectArgument(); } return this; diff --git a/test/Sema/parentheses.cpp b/test/Sema/parentheses.cpp index c14a671292..252455dcad 100644 --- a/test/Sema/parentheses.cpp +++ b/test/Sema/parentheses.cpp @@ -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 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"); +}