[cfe-commits] r90825 - in /cfe/trunk: lib/CodeGen/CGCXX.cpp lib/CodeGen/CGExpr.cpp test/CodeGenCXX/member-call-parens.cpp

Eli Friedman eli.friedman at gmail.com
Mon Dec 7 18:09:46 PST 2009


Author: efriedma
Date: Mon Dec  7 20:09:46 2009
New Revision: 90825

URL: http://llvm.org/viewvc/llvm-project?rev=90825&view=rev
Log:
Fix some direct checks of expressions which might be surrounded by parentheses.


Added:
    cfe/trunk/test/CodeGenCXX/member-call-parens.cpp
Modified:
    cfe/trunk/lib/CodeGen/CGCXX.cpp
    cfe/trunk/lib/CodeGen/CGExpr.cpp

Modified: cfe/trunk/lib/CodeGen/CGCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCXX.cpp?rev=90825&r1=90824&r2=90825&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGCXX.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGCXX.cpp Mon Dec  7 20:09:46 2009
@@ -241,10 +241,10 @@
 }
 
 RValue CodeGenFunction::EmitCXXMemberCallExpr(const CXXMemberCallExpr *CE) {
-  if (isa<BinaryOperator>(CE->getCallee())) 
+  if (isa<BinaryOperator>(CE->getCallee()->IgnoreParens())) 
     return EmitCXXMemberPointerCallExpr(CE);
       
-  const MemberExpr *ME = cast<MemberExpr>(CE->getCallee());
+  const MemberExpr *ME = cast<MemberExpr>(CE->getCallee()->IgnoreParens());
   const CXXMethodDecl *MD = cast<CXXMethodDecl>(ME->getMemberDecl());
 
   if (MD->isStatic()) {
@@ -307,7 +307,8 @@
 
 RValue
 CodeGenFunction::EmitCXXMemberPointerCallExpr(const CXXMemberCallExpr *E) {
-  const BinaryOperator *BO = cast<BinaryOperator>(E->getCallee());
+  const BinaryOperator *BO =
+      cast<BinaryOperator>(E->getCallee()->IgnoreParens());
   const Expr *BaseExpr = BO->getLHS();
   const Expr *MemFnExpr = BO->getRHS();
   

Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=90825&r1=90824&r2=90825&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGExpr.cpp Mon Dec  7 20:09:46 2009
@@ -1408,7 +1408,7 @@
     if (const CXXMethodDecl *MD = dyn_cast_or_null<CXXMethodDecl>(TargetDecl))
       return EmitCXXOperatorMemberCallExpr(CE, MD);
 
-  if (isa<CXXPseudoDestructorExpr>(E->getCallee())) {
+  if (isa<CXXPseudoDestructorExpr>(E->getCallee()->IgnoreParens())) {
     // C++ [expr.pseudo]p1:
     //   The result shall only be used as the operand for the function call
     //   operator (), and the result of such a call has type void. The only

Added: cfe/trunk/test/CodeGenCXX/member-call-parens.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/member-call-parens.cpp?rev=90825&view=auto

==============================================================================
--- cfe/trunk/test/CodeGenCXX/member-call-parens.cpp (added)
+++ cfe/trunk/test/CodeGenCXX/member-call-parens.cpp Mon Dec  7 20:09:46 2009
@@ -0,0 +1,12 @@
+// RUN: clang-cc -emit-llvm-only -verify %s
+
+struct A { int a(); };
+typedef int B;
+void a() {
+  A x;
+  ((x.a))();
+  ((x.*&A::a))();
+  B y;
+  // FIXME: Sema doesn't like this for some reason...
+  //(y.~B)();
+}





More information about the cfe-commits mailing list