diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp index 535c87ec1158e99170e210c86dc693efb2a480af..84cdaab5176fbd964fe6932cbd45f97bb5d2989a 100644 --- a/clang/lib/Basic/TargetInfo.cpp +++ b/clang/lib/Basic/TargetInfo.cpp @@ -548,11 +548,17 @@ bool TargetInfo::validateInputConstraint(ConstraintInfo *OutputConstraints, default: // Check if we have a matching constraint if (*Name >= '0' && *Name <= '9') { - unsigned i = *Name - '0'; + const char *DigitStart = Name; + while (Name[1] >= '0' && Name[1] <= '9') + Name++; + const char *DigitEnd = Name; + unsigned i; + if (StringRef(DigitStart, DigitEnd - DigitStart + 1) + .getAsInteger(10, i)) + return false; // Check if matching constraint is out of bounds. - if (i >= NumOutputs) - return false; + if (i >= NumOutputs) return false; // A number must refer to an output only operand. if (OutputConstraints[i].isReadWrite()) diff --git a/clang/test/Sema/asm.c b/clang/test/Sema/asm.c index f386f520be4db00655f403dd32c99319a247c20a..41a8265600d6964472f3773fa0b4e28abcef3c63 100644 --- a/clang/test/Sema/asm.c +++ b/clang/test/Sema/asm.c @@ -197,3 +197,10 @@ void fn5() { : [g] "+r"(l) : "[g]"(l)); // expected-error {{invalid input constraint '[g]' in asm}} } + +void fn6() { + int a; + __asm__("" + : "=rm"(a), "=rm"(a) + : "11m"(a)) // expected-error {{invalid input constraint '11m' in asm}} +}