From b6b5643b365610bf1d883f5921cc37041889666e Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Sun, 11 Jan 2015 10:22:41 +0000 Subject: [PATCH] Basic: Numeric constraints are multidigit Clang would treat the digits in an "11m" input constraint separately as if it was handling constraint 1 twice instead of constraint 11. llvm-svn: 225606 --- clang/lib/Basic/TargetInfo.cpp | 12 +++++++++--- clang/test/Sema/asm.c | 7 +++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp index 535c87ec1158..84cdaab5176f 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 f386f520be4d..41a8265600d6 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}} +} -- GitLab