From 984f2783ad8319aa0cbfca1c4a719688b1ecfd5e Mon Sep 17 00:00:00 2001 From: Bill Wendling Date: Fri, 22 Mar 2013 21:33:46 +0000 Subject: [PATCH] Use RequireCompleteType() instead of isIncompleteType(). isIncompleteType() returns true or false for template types depending on whether the type is instantiated yet. In this context, that's arbitrary. The better way to check for a complete type is RequireCompleteType(). Thanks to Eli Friedman for noticing this! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@177768 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaStmtAsm.cpp | 4 +++- test/CodeGen/x86_32-inline-asm.c | 9 ++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/Sema/SemaStmtAsm.cpp b/lib/Sema/SemaStmtAsm.cpp index 3e9606e467..95964e20a7 100644 --- a/lib/Sema/SemaStmtAsm.cpp +++ b/lib/Sema/SemaStmtAsm.cpp @@ -181,7 +181,9 @@ StmtResult Sema::ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, InputConstraintInfos.push_back(Info); const Type *Ty = Exprs[i]->getType().getTypePtr(); - if (Ty->isDependentType() || Ty->isIncompleteType()) + if (Ty->isDependentType() || + RequireCompleteType(InputExpr->getLocStart(), + Exprs[i]->getType(), 0)) continue; unsigned Size = Context.getTypeSize(Ty); diff --git a/test/CodeGen/x86_32-inline-asm.c b/test/CodeGen/x86_32-inline-asm.c index 527ad85581..aebc4e4a06 100644 --- a/test/CodeGen/x86_32-inline-asm.c +++ b/test/CodeGen/x86_32-inline-asm.c @@ -7,7 +7,7 @@ typedef u_int32_t uint32_t; typedef unsigned long long u_int64_t; typedef u_int64_t uint64_t; -int func() { +int func1() { // Error out if size is > 32-bits. uint32_t msr = 0x8b; uint64_t val = 0; @@ -22,3 +22,10 @@ int func() { unsigned int port; __asm__ volatile("outb %0, %w1" : : "a" (data), "Nd" (port)); // No error expected. } + +struct S; +void func2(struct S *s) { + __asm__ volatile("" + : + : "a" (*s)); +} -- 2.49.0