]> granicus.if.org Git - clang/commitdiff
Reject asm output constraints that consist of modifiers only.
authorBenjamin Kramer <benny.kra@googlemail.com>
Thu, 18 Apr 2013 13:23:23 +0000 (13:23 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Thu, 18 Apr 2013 13:23:23 +0000 (13:23 +0000)
Fixes PR15759.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@179756 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Basic/TargetInfo.cpp
test/Sema/asm.c

index 70ea2351ec3529ed78328fd9c69e7a80b952efce..699f7d4b3f9290db019154ac7186ca24f26e4547 100644 (file)
@@ -373,7 +373,7 @@ bool TargetInfo::validateOutputConstraint(ConstraintInfo &Info) const {
     Name++;
   }
 
-  return true;
+  return Info.allowsMemory() || Info.allowsRegister();
 }
 
 bool TargetInfo::resolveSymbolicName(const char *&Name,
index 2c600854bf8bb33569838b0ed1c1f83ce3c4fabc..c81f16a3875d877667fad3cd4f5d2e0b81a460f7 100644 (file)
@@ -130,3 +130,19 @@ void test14(struct S *s) {
   __asm("": : "a"(*s)); // expected-error {{dereference of pointer to incomplete type 'struct S'}}
   __asm("": "=a" (*s) :); // expected-error {{dereference of pointer to incomplete type 'struct S'}}
 }
+
+// PR15759.
+double test15() {
+  double ret = 0;
+  __asm("0.0":"="(ret)); // expected-error {{invalid output constraint '=' in asm}}
+  __asm("0.0":"=&"(ret)); // expected-error {{invalid output constraint '=&' in asm}}
+  __asm("0.0":"+?"(ret)); // expected-error {{invalid output constraint '+?' in asm}}
+  __asm("0.0":"+!"(ret)); // expected-error {{invalid output constraint '+!' in asm}}
+  __asm("0.0":"+#"(ret)); // expected-error {{invalid output constraint '+#' in asm}}
+  __asm("0.0":"+*"(ret)); // expected-error {{invalid output constraint '+*' in asm}}
+  __asm("0.0":"=%"(ret)); // expected-error {{invalid output constraint '=%' in asm}}
+  __asm("0.0":"=,="(ret)); // expected-error {{invalid output constraint '=,=' in asm}}
+  __asm("0.0":"=,g"(ret)); // no-error
+  __asm("0.0":"=g"(ret)); // no-error
+  return ret;
+}