Author: rnk Date: Fri Jul 11 18:54:29 2014 New Revision: 212860 URL: http://llvm.org/viewvc/llvm-project?rev=212860&view=rev Log: Form a CallExpr from __noop without parens
MSVC accepts __noop without any trailing parens and treats it like a literal zero. We don't treat __noop as an integer literal, but now at least we can parse a naked __noop expression. Reviewers: rsmith Differential Revision: http://reviews.llvm.org/D4476 Modified: cfe/trunk/lib/Sema/SemaExpr.cpp cfe/trunk/test/CodeGen/builtin-ms-noop.cpp Modified: cfe/trunk/lib/Sema/SemaExpr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=212860&r1=212859&r2=212860&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) +++ cfe/trunk/lib/Sema/SemaExpr.cpp Fri Jul 11 18:54:29 2014 @@ -13477,9 +13477,22 @@ ExprResult Sema::CheckPlaceholderExpr(Ex case BuiltinType::PseudoObject: return checkPseudoObjectRValue(E); - case BuiltinType::BuiltinFn: + case BuiltinType::BuiltinFn: { + // Accept __noop without parens by implicitly converting it to a call expr. + auto *DRE = dyn_cast<DeclRefExpr>(E->IgnoreParenImpCasts()); + if (DRE) { + auto *FD = cast<FunctionDecl>(DRE->getDecl()); + if (FD->getBuiltinID() == Builtin::BI__noop) { + E = ImpCastExprToType(E, Context.getPointerType(FD->getType()), + CK_BuiltinFnToFnPtr).get(); + return new (Context) CallExpr(Context, E, None, Context.IntTy, + VK_RValue, SourceLocation()); + } + } + Diag(E->getLocStart(), diag::err_builtin_fn_use); return ExprError(); + } // Everything else should be impossible. #define BUILTIN_TYPE(Id, SingletonId) \ Modified: cfe/trunk/test/CodeGen/builtin-ms-noop.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/builtin-ms-noop.cpp?rev=212860&r1=212859&r2=212860&view=diff ============================================================================== --- cfe/trunk/test/CodeGen/builtin-ms-noop.cpp (original) +++ cfe/trunk/test/CodeGen/builtin-ms-noop.cpp Fri Jul 11 18:54:29 2014 @@ -1,13 +1,30 @@ -// RUN: %clang_cc1 -fms-extensions -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck %s +// RUN: %clang_cc1 -fms-extensions -triple x86_64-unknown-unknown -emit-llvm %s -o - | FileCheck %s -class A { - public: +struct A { ~A() {} }; -int f() { -// CHECK: @_Z1fv +extern "C" int f() { +// CHECK: define i32 @f() // CHECK-NOT: call void @_ZN1AD1Ev // CHECK: ret i32 0 return __noop(A()); }; + +extern "C" int g() { + return __noop; +// CHECK: define i32 @g() +// CHECK: ret i32 0 +} + +extern "C" int h() { + return (__noop); +// CHECK: define i32 @h() +// CHECK: ret i32 0 +} + +extern "C" int i() { + return __noop + 1; +// CHECK: define i32 @i() +// CHECK: ret i32 1 +} _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
