Author: gbiv Date: Thu Dec 1 11:52:39 2016 New Revision: 288388 URL: http://llvm.org/viewvc/llvm-project?rev=288388&view=rev Log: [TableGen] Ignore fake args for parsing-related arg counts.
We should complain about the following: ``` void foo() __attribute__((unavailable("a", "b"))); ``` Instead, we currently just ignore "b". (...We also end up ignoring "a", because we assume elsewhere that this attribute can only have 1 or 0 args.) This happens because `unavailable` has a fake enum arg, and `AttributeList::{getMinArgs,getMaxArgs}` include fake args in their counts. Modified: cfe/trunk/test/Sema/attr-unavailable-message.c cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp Modified: cfe/trunk/test/Sema/attr-unavailable-message.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/attr-unavailable-message.c?rev=288388&r1=288387&r2=288388&view=diff ============================================================================== --- cfe/trunk/test/Sema/attr-unavailable-message.c (original) +++ cfe/trunk/test/Sema/attr-unavailable-message.c Thu Dec 1 11:52:39 2016 @@ -1,6 +1,8 @@ // RUN: %clang_cc1 -fsyntax-only -verify %s // rdar: //6734520 +void tooManyArgs() __attribute__((unavailable("a", "b"))); // expected-error {{'unavailable' attribute takes no more than 1 argument}} + int foo(int) __attribute__((__unavailable__("USE IFOO INSTEAD"))); // expected-note {{'foo' has been explicitly marked unavailable here}} double dfoo(double) __attribute__((__unavailable__("NO LONGER"))); // expected-note 2 {{'dfoo' has been explicitly marked unavailable here}} Modified: cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp?rev=288388&r1=288387&r2=288388&view=diff ============================================================================== --- cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp (original) +++ cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp Thu Dec 1 11:52:39 2016 @@ -2540,6 +2540,10 @@ static void emitArgInfo(const Record &R, unsigned ArgCount = 0, OptCount = 0; bool HasVariadic = false; for (const auto *Arg : Args) { + // If the arg is fake, it's the user's job to supply it: general parsing + // logic shouldn't need to know anything about it. + if (Arg->getValueAsBit("Fake")) + continue; Arg->getValueAsBit("Optional") ? ++OptCount : ++ArgCount; if (!HasVariadic && isArgVariadic(*Arg, R.getName())) HasVariadic = true; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits