Index: cfe/trunk/lib/CodeGen/CGStmt.cpp =================================================================== --- cfe/trunk/lib/CodeGen/CGStmt.cpp +++ cfe/trunk/lib/CodeGen/CGStmt.cpp @@ -1696,7 +1696,8 @@ if (Info.allowsRegister() || !Info.allowsMemory()) if (CodeGenFunction::hasScalarEvaluationKind(InputExpr->getType())) return EmitScalarExpr(InputExpr); - + if (InputExpr->getStmtClass() == Expr::CXXThisExprClass) + return EmitScalarExpr(InputExpr); InputExpr = InputExpr->IgnoreParenNoopCasts(getContext()); LValue Dest = EmitLValue(InputExpr); return EmitAsmInputLValue(Info, Dest, InputExpr->getType(), ConstraintStr, Index: cfe/trunk/lib/Parse/ParseStmtAsm.cpp =================================================================== --- cfe/trunk/lib/Parse/ParseStmtAsm.cpp +++ cfe/trunk/lib/Parse/ParseStmtAsm.cpp @@ -215,17 +215,22 @@ // Require an identifier here. SourceLocation TemplateKWLoc; UnqualifiedId Id; - bool Invalid = - ParseUnqualifiedId(SS, - /*EnteringContext=*/false, - /*AllowDestructorName=*/false, - /*AllowConstructorName=*/false, - /*ObjectType=*/ParsedType(), TemplateKWLoc, Id); - - // Perform the lookup. - ExprResult Result = Actions.LookupInlineAsmIdentifier( - SS, TemplateKWLoc, Id, Info, IsUnevaluatedContext); - + bool Invalid = true; + ExprResult Result; + if (Tok.is(tok::kw_this)) { + Result = ParseCXXThis(); + Invalid = false; + } else { + Invalid = + ParseUnqualifiedId(SS, + /*EnteringContext=*/false, + /*AllowDestructorName=*/false, + /*AllowConstructorName=*/false, + /*ObjectType=*/ParsedType(), TemplateKWLoc, Id); + // Perform the lookup. + Result = Actions.LookupInlineAsmIdentifier(SS, TemplateKWLoc, Id, Info, + IsUnevaluatedContext); + } // While the next two tokens are 'period' 'identifier', repeatedly parse it as // a field access. We have to avoid consuming assembler directives that look // like '.' 'else'. Index: cfe/trunk/test/CodeGen/ms_this.cpp =================================================================== --- cfe/trunk/test/CodeGen/ms_this.cpp +++ cfe/trunk/test/CodeGen/ms_this.cpp @@ -0,0 +1,49 @@ +// RUN: %clang_cc1 -fasm-blocks -emit-llvm %s -o - | FileCheck %s +class t1 { +public: + double a; + void runc(); +}; + +class t2 { +public: + double a; + void runc(); +}; + +void t2::runc() { + double num = 0; + __asm { + mov rax,[this] + //CHECK: %this.addr = alloca %class.t2* + //CHECK: call void asm sideeffect inteldialect "mov rax,qword ptr $1{{.*}}%class.t2* %this1 + mov rbx,[rax] + mov num, rbx + }; +} + +void t1::runc() { + double num = 0; + __asm { + mov rax,[this] + //CHECK: %this.addr = alloca %class.t1* + //CHECK: call void asm sideeffect inteldialect "mov rax,qword ptr $1{{.*}}%class.t1* %this1 + mov rbx,[rax] + mov num, rbx + }; +} + +struct s { + int a; + void func() { + __asm mov rax, [this] + //CHECK: %this.addr = alloca %struct.s* + //CHECK: call void asm sideeffect inteldialect "mov rax, qword ptr $0{{.*}}%struct.s* %this1 + } +} f3; + +int main() { + f3.func(); + f3.a=1; + return 0; +}