summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2014-12-29 10:29:53 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2014-12-29 10:29:53 +0000
commit04b78412ad0aa74876341a96ba6178175d537ab3 (patch)
treef94fbeb98111467f43e39cd4428c82b954965eeb
parente86c8c807f3a9d840b23ba862234328e3211f233 (diff)
downloadbcm5719-llvm-04b78412ad0aa74876341a96ba6178175d537ab3.tar.gz
bcm5719-llvm-04b78412ad0aa74876341a96ba6178175d537ab3.zip
Sema: Permit array l-values in asm output operands
GCC permits array l-values in asm output operands even though they aren't modifiable l-values. We used to permit it but this behavior regressed in r224916. llvm-svn: 224918
-rw-r--r--clang/lib/Sema/SemaStmtAsm.cpp3
-rw-r--r--clang/test/SemaCXX/statements.cpp4
2 files changed, 7 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaStmtAsm.cpp b/clang/lib/Sema/SemaStmtAsm.cpp
index 24a91716cb8..afd785c5dfb 100644
--- a/clang/lib/Sema/SemaStmtAsm.cpp
+++ b/clang/lib/Sema/SemaStmtAsm.cpp
@@ -156,6 +156,9 @@ StmtResult Sema::ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
case Expr::MLV_Valid:
// Cool, this is an lvalue.
break;
+ case Expr::MLV_ArrayType:
+ // This is OK too.
+ break;
case Expr::MLV_LValueCast: {
const Expr *LVal = OutputExpr->IgnoreParenNoopCasts(Context);
if (!getLangOpts().HeinousExtensions) {
diff --git a/clang/test/SemaCXX/statements.cpp b/clang/test/SemaCXX/statements.cpp
index 22648f3a081..efca37dcba1 100644
--- a/clang/test/SemaCXX/statements.cpp
+++ b/clang/test/SemaCXX/statements.cpp
@@ -30,3 +30,7 @@ void test4(int) { // expected-note{{possible target for call}}
// expected-error@+1{{overloaded function could not be resolved}}
__asm__ ("":"+r" (test4)); // expected-error{{invalid lvalue in asm output}}
}
+void test5() {
+ char buf[1];
+ __asm__ ("":"+r" (buf));
+}
OpenPOWER on IntegriCloud