From: Nico Weber Date: Tue, 6 May 2014 03:13:27 +0000 (+0000) Subject: Support field references to struct names and c++11 aliases from inline asm. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=30dabc00de4fe230663702ebfbf415084075ba68;p=clang Support field references to struct names and c++11 aliases from inline asm. This is in addition to the existing support for typedefs. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@208053 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaStmtAsm.cpp b/lib/Sema/SemaStmtAsm.cpp index 1cbc901da6..e733fd0c33 100644 --- a/lib/Sema/SemaStmtAsm.cpp +++ b/lib/Sema/SemaStmtAsm.cpp @@ -441,8 +441,10 @@ bool Sema::LookupInlineAsmField(StringRef Base, StringRef Member, NamedDecl *FoundDecl = BaseResult.getFoundDecl(); if (VarDecl *VD = dyn_cast(FoundDecl)) RT = VD->getType()->getAs(); - else if (TypedefDecl *TD = dyn_cast(FoundDecl)) + else if (TypedefNameDecl *TD = dyn_cast(FoundDecl)) RT = TD->getUnderlyingType()->getAs(); + else if (TypeDecl *TD = dyn_cast(FoundDecl)) + RT = TD->getTypeForDecl()->getAs(); if (!RT) return true; diff --git a/test/CodeGen/ms-inline-asm.cpp b/test/CodeGen/ms-inline-asm.cpp index b1c13e57f1..83fe1075af 100644 --- a/test/CodeGen/ms-inline-asm.cpp +++ b/test/CodeGen/ms-inline-asm.cpp @@ -1,5 +1,5 @@ // REQUIRES: x86-registered-target -// RUN: %clang_cc1 -x c++ %s -triple i386-apple-darwin10 -fasm-blocks -emit-llvm -o - | FileCheck %s +// RUN: %clang_cc1 -x c++ %s -triple i386-apple-darwin10 -fasm-blocks -emit-llvm -o - -std=c++11 | FileCheck %s // rdar://13645930 @@ -111,3 +111,33 @@ void test6() { jmp a } } + +void t7_struct() { + struct A { + int a; + int b; + }; + __asm mov eax, [eax].A.b + // CHECK-LABEL: define void @_Z9t7_structv + // CHECK: call void asm sideeffect inteldialect "mov eax, [eax].4", "~{eax},~{dirflag},~{fpsr},~{flags}"() +} + +void t7_typedef() { + typedef struct { + int a; + int b; + } A; + __asm mov eax, [eax].A.b + // CHECK-LABEL: define void @_Z10t7_typedefv + // CHECK: call void asm sideeffect inteldialect "mov eax, [eax].4", "~{eax},~{dirflag},~{fpsr},~{flags}"() +} + +void t7_using() { + using A = struct { + int a; + int b; + }; + __asm mov eax, [eax].A.b + // CHECK-LABEL: define void @_Z8t7_usingv + // CHECK: call void asm sideeffect inteldialect "mov eax, [eax].4", "~{eax},~{dirflag},~{fpsr},~{flags}"() +}