[PATCH] Add PragmaAttr and Pragma Spelling to Tablegen

Aaron Ballman aaron at aaronballman.com
Fri Jun 6 15:56:44 PDT 2014


On Fri, Jun 6, 2014 at 5:13 PM, Tyler Nowicki <tnowicki at apple.com> wrote:
> Hi Aaron,
>
> I noticed that 'pragma-loop-ast.cpp' wasn’t committed along with the first patch. I think this test is close to the print pretty test you are asking for. The pragma needs to be defined before a loop to pass parsing so that is the minimum amount of code to use the pragma. Also it uses -ast-print and verifies that the result matches the expected print pretty string.
>
> Here is the patch rebased against master with the calf patch applied and I moved pragma-loop-ast.cpp to test/Sema/pragma-loop.cpp.

I'm not entirely certain of why, but I am still getting merge
conflicts from TortoiseSVN when I attempt to merge this against a
clean ToT. Specifically:

--- include/clang/Basic/Attr.td
+++ include/clang/Basic/Attr.td
@@ -192,0 +193,3 @@
+class Pragma<string namespace, string name> : Spelling<name, "Pragma"> {
+  string Namespace = namespace;
+}

--- utils/TableGen/ClangAttrEmitter.cpp
+++ utils/TableGen/ClangAttrEmitter.cpp
@@ -1092,0 +1093,8 @@
+    } else if (Variety == "Pragma") {
+      Prefix = "#pragma ";
+      Suffix = "\n";
+      std::string Namespace = Spellings[I].nameSpace();
+      if (!Namespace.empty()) {
+        Spelling += Namespace;
+        Spelling += " ";
+      }
@@ -1102,0 +1111,8 @@
+    if (Variety == "Pragma") {
+      OS << " \";\n";
+      OS << "    printPrettyPragma(OS, Policy);\n";
+      OS << "    break;\n";
+      OS << "  }\n";
+      continue;
+    }
+
@@ -1811,0 +1829,3 @@
+  OS << "case AttrSyntax::Pragma:\n";
+  OS << "  return llvm::StringSwitch<bool>(Name)\n";
+  GenerateHasAttrSpellingStringSwitch(Pragma, OS, "Pragma");
@@ -2519,0 +2540,2 @@
+        else if (Variety == "Pragma")
+          Matches = &Pragma;
@@ -2543,0 +2566,2 @@
+  OS << "  } else if (AttributeList::AS_Pragma == Syntax) {\n";
+  StringMatcher("Name", Pragma, OS).Emit();
@@ -2740,0 +2768,2 @@
+  OS << "\"\n\n";
+  if (SupportedSpellings & Pragma) OS << "X";

What's neat is, there's no way for me to edit the conflicts. It flat
out rejects these chunks.

That being said, the test could be a bit more specific by using
CHECK-NEXT to ensure the pragmas are in the correct order and
positioning relating to the loops. I gave an example of that in a
different email thread regarding an XFAILed test, which I think should
also be a part of this patch (since it related to the new
functionality here). The test you include here is a good test to have
just the same (it'll be redundant once we fix the XFAILed test, but we
can delete one of the two of them at that point), but I think it
should live in Misc more than Sema (since we're not checking the
semantics engine works). So perhaps the two tests should be:
test/Misc/ast-print-pragmas-xfail.cpp and
test/Misc/ast-print-pragmas.cpp?

~Aaron




More information about the cfe-commits mailing list