From 461a2c064078d0cca4959dd6b6fa09e59cc70547 Mon Sep 17 00:00:00 2001
From: Anders Carlsson <andersca@mac.com>
Date: Sat, 14 Nov 2009 21:26:41 +0000
Subject: [PATCH] Always build a builtin operator expression for the
 __extension__ unary operator.

llvm-svn: 88811
---
 clang/lib/Sema/SemaExpr.cpp                         | 3 ++-
 clang/test/SemaCXX/overloaded-builtin-operators.cpp | 3 +++
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index b311fda2d3c4..0d4ce609136f 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -5711,7 +5711,8 @@ Action::OwningExprResult Sema::BuildUnaryOp(Scope *S, SourceLocation OpLoc,
                                             UnaryOperator::Opcode Opc,
                                             ExprArg input) {
   Expr *Input = (Expr*)input.get();
-  if (getLangOptions().CPlusPlus && Input->getType()->isOverloadableType()) {
+  if (getLangOptions().CPlusPlus && Input->getType()->isOverloadableType() &&
+      Opc != UnaryOperator::Extension) {
     // Find all of the overloaded operators visible from this
     // point. We perform both an operator-name lookup from the local
     // scope and an argument-dependent lookup based on the types of
diff --git a/clang/test/SemaCXX/overloaded-builtin-operators.cpp b/clang/test/SemaCXX/overloaded-builtin-operators.cpp
index 89ac29adc730..fd0cbc6c8643 100644
--- a/clang/test/SemaCXX/overloaded-builtin-operators.cpp
+++ b/clang/test/SemaCXX/overloaded-builtin-operators.cpp
@@ -185,3 +185,6 @@ int test_pr5432() {
   return a[X][X];
 }
 
+void f() {
+  (void)__extension__(A());
+}