<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div><blockquote type="cite" class=""><div class="">On Feb 29, 2016, at 5:44 PM, Sean Silva <<a href="mailto:chisophugis@gmail.com" class="">chisophugis@gmail.com</a>> wrote:</div><div class=""><div dir="ltr" class="">This seems to be causing a substantial amount of warning spew from MSVC:<div class=""><a href="http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast/builds/955" class="">http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast/builds/955</a><br class=""></div><div class=""><br class=""></div><div class="">I think our recommended "portable" method of using llvm_unreachable is outside the switch, instead of in the default case: <a href="http://llvm.org/docs/CodingStandards.html#don-t-use-default-labels-in-fully-covered-switches-over-enumerations" class="">http://llvm.org/docs/CodingStandards.html#don-t-use-default-labels-in-fully-covered-switches-over-enumerations</a></div></div></div></blockquote><div><br class=""></div>Sorry, should be fixed in r262288.  I’ll be back in a few hours, feel free to revert if it doesn’t clear up.</div><div><br class=""></div><div>John.</div><div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class=""><br class=""></div><div class="">-- Sean Silva</div></div><div class="gmail_extra"><br class=""><div class="gmail_quote">On Mon, Feb 29, 2016 at 4:18 PM, John McCall via cfe-commits <span dir="ltr" class=""><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank" class="">cfe-commits@lists.llvm.org</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rjmccall<br class="">
Date: Mon Feb 29 18:18:05 2016<br class="">
New Revision: 262275<br class="">
<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=262275&view=rev" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project?rev=262275&view=rev</a><br class="">
Log:<br class="">
Infrastructure improvements to Clang attribute TableGen.<br class="">
<br class="">
This should make it easier to add new Attr subclasses.<br class="">
<br class="">
Modified:<br class="">
    cfe/trunk/include/clang/AST/Attr.h<br class="">
    cfe/trunk/include/clang/Basic/AttrKinds.h<br class="">
    cfe/trunk/lib/AST/ASTDumper.cpp<br class="">
    cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp<br class="">
<br class="">
Modified: cfe/trunk/include/clang/AST/Attr.h<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Attr.h?rev=262275&r1=262274&r2=262275&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Attr.h?rev=262275&r1=262274&r2=262275&view=diff</a><br class="">
==============================================================================<br class="">
--- cfe/trunk/include/clang/AST/Attr.h (original)<br class="">
+++ cfe/trunk/include/clang/AST/Attr.h Mon Feb 29 18:18:05 2016<br class="">
@@ -129,7 +129,8 @@ public:<br class="">
<br class="">
   // Implement isa/cast/dyncast/etc.<br class="">
   static bool classof(const Attr *A) {<br class="">
-    return A->getKind() <= attr::LAST_INHERITABLE;<br class="">
+    return A->getKind() >= attr::FirstInheritableAttr &&<br class="">
+           A->getKind() <= attr::LastInheritableAttr;<br class="">
   }<br class="">
 };<br class="">
<br class="">
@@ -143,9 +144,8 @@ protected:<br class="">
 public:<br class="">
   // Implement isa/cast/dyncast/etc.<br class="">
   static bool classof(const Attr *A) {<br class="">
-    // Relies on relative order of enum emission with respect to MS inheritance<br class="">
-    // attrs.<br class="">
-    return A->getKind() <= attr::LAST_INHERITABLE_PARAM;<br class="">
+    return A->getKind() >= attr::FirstInheritableParamAttr &&<br class="">
+           A->getKind() <= attr::LastInheritableParamAttr;<br class="">
   }<br class="">
 };<br class="">
<br class="">
<br class="">
Modified: cfe/trunk/include/clang/Basic/AttrKinds.h<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/AttrKinds.h?rev=262275&r1=262274&r2=262275&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/AttrKinds.h?rev=262275&r1=262274&r2=262275&view=diff</a><br class="">
==============================================================================<br class="">
--- cfe/trunk/include/clang/Basic/AttrKinds.h (original)<br class="">
+++ cfe/trunk/include/clang/Basic/AttrKinds.h Mon Feb 29 18:18:05 2016<br class="">
@@ -22,10 +22,10 @@ namespace attr {<br class="">
 // \brief A list of all the recognized kinds of attributes.<br class="">
 enum Kind {<br class="">
 #define ATTR(X) X,<br class="">
-#define LAST_INHERITABLE_ATTR(X) X, LAST_INHERITABLE = X,<br class="">
-#define LAST_INHERITABLE_PARAM_ATTR(X) X, LAST_INHERITABLE_PARAM = X,<br class="">
+#define ATTR_RANGE(CLASS, FIRST_NAME, LAST_NAME) \<br class="">
+  First##CLASS = FIRST_NAME,                    \<br class="">
+  Last##CLASS = LAST_NAME,<br class="">
 #include "clang/Basic/AttrList.inc"<br class="">
-  NUM_ATTRS<br class="">
 };<br class="">
<br class="">
 } // end namespace attr<br class="">
<br class="">
Modified: cfe/trunk/lib/AST/ASTDumper.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTDumper.cpp?rev=262275&r1=262274&r2=262275&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTDumper.cpp?rev=262275&r1=262274&r2=262275&view=diff</a><br class="">
==============================================================================<br class="">
--- cfe/trunk/lib/AST/ASTDumper.cpp (original)<br class="">
+++ cfe/trunk/lib/AST/ASTDumper.cpp Mon Feb 29 18:18:05 2016<br class="">
@@ -819,8 +819,6 @@ void ASTDumper::dumpAttr(const Attr *A)<br class="">
       switch (A->getKind()) {<br class="">
 #define ATTR(X) case attr::X: OS << #X; break;<br class="">
 #include "clang/Basic/AttrList.inc"<br class="">
-      default:<br class="">
-        llvm_unreachable("unexpected attribute kind");<br class="">
       }<br class="">
       OS << "Attr";<br class="">
     }<br class="">
<br class="">
Modified: cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp?rev=262275&r1=262274&r2=262275&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp?rev=262275&r1=262274&r2=262275&view=diff</a><br class="">
==============================================================================<br class="">
--- cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp (original)<br class="">
+++ cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp Mon Feb 29 18:18:05 2016<br class="">
@@ -1718,8 +1718,6 @@ void EmitClangAttrImpl(RecordKeeper &Rec<br class="">
       OS << "    return cast<" << R.getName() << "Attr>(this)->" << Method<br class="">
          << ";\n";<br class="">
     }<br class="">
-    OS << "  case attr::NUM_ATTRS:\n";<br class="">
-    OS << "    break;\n";<br class="">
     OS << "  }\n";<br class="">
     OS << "  llvm_unreachable(\"Unexpected attribute kind!\");\n";<br class="">
     OS << "}\n\n";<br class="">
@@ -1738,20 +1736,10 @@ void EmitClangAttrImpl(RecordKeeper &Rec<br class="">
<br class="">
 } // end namespace clang<br class="">
<br class="">
-static void EmitAttrList(raw_ostream &OS, StringRef Class,<br class="">
+static void emitAttrList(raw_ostream &OS, StringRef Class,<br class="">
                          const std::vector<Record*> &AttrList) {<br class="">
-  auto i = AttrList.cbegin(), e = AttrList.cend();<br class="">
-<br class="">
-  if (i != e) {<br class="">
-    // Move the end iterator back to emit the last attribute.<br class="">
-    for(--e; i != e; ++i) {<br class="">
-      if (!(*i)->getValueAsBit("ASTNode"))<br class="">
-        continue;<br class="">
-<br class="">
-      OS << Class << "(" << (*i)->getName() << ")\n";<br class="">
-    }<br class="">
-<br class="">
-    OS << "LAST_" << Class << "(" << (*i)->getName() << ")\n\n";<br class="">
+  for (auto Cur : AttrList) {<br class="">
+    OS << Class << "(" << Cur->getName() << ")\n";<br class="">
   }<br class="">
 }<br class="">
<br class="">
@@ -1764,71 +1752,216 @@ static bool AttrHasPragmaSpelling(const<br class="">
          }) != Spellings.end();<br class="">
 }<br class="">
<br class="">
-namespace clang {<br class="">
-// Emits the enumeration list for attributes.<br class="">
-void EmitClangAttrList(RecordKeeper &Records, raw_ostream &OS) {<br class="">
-  emitSourceFileHeader("List of all attributes that Clang recognizes", OS);<br class="">
+namespace {<br class="">
+  struct AttrClassDescriptor {<br class="">
+    const char * const MacroName;<br class="">
+    const char * const TableGenName;<br class="">
+  };<br class="">
+}<br class="">
<br class="">
-  OS << "#ifndef LAST_ATTR\n";<br class="">
-  OS << "#define LAST_ATTR(NAME) ATTR(NAME)\n";<br class="">
-  OS << "#endif\n\n";<br class="">
+static const AttrClassDescriptor AttrClassDescriptors[] = {<br class="">
+  { "ATTR", "Attr" },<br class="">
+  { "INHERITABLE_ATTR", "InheritableAttr" },<br class="">
+  { "INHERITABLE_PARAM_ATTR", "InheritableParamAttr" }<br class="">
+};<br class="">
+<br class="">
+static void emitDefaultDefine(raw_ostream &OS, StringRef name,<br class="">
+                              const char *superName) {<br class="">
+  OS << "#ifndef " << name << "\n";<br class="">
+  OS << "#define " << name << "(NAME) ";<br class="">
+  if (superName) OS << superName << "(NAME)";<br class="">
+  OS << "\n#endif\n\n";<br class="">
+}<br class="">
+<br class="">
+namespace {<br class="">
+  /// A class of attributes.<br class="">
+  struct AttrClass {<br class="">
+    const AttrClassDescriptor &Descriptor;<br class="">
+    Record *TheRecord;<br class="">
+    AttrClass *SuperClass = nullptr;<br class="">
+    std::vector<AttrClass*> SubClasses;<br class="">
+    std::vector<Record*> Attrs;<br class="">
+<br class="">
+    AttrClass(const AttrClassDescriptor &Descriptor, Record *R)<br class="">
+      : Descriptor(Descriptor), TheRecord(R) {}<br class="">
+<br class="">
+    void emitDefaultDefines(raw_ostream &OS) const {<br class="">
+      // Default the macro unless this is a root class (i.e. Attr).<br class="">
+      if (SuperClass) {<br class="">
+        emitDefaultDefine(OS, Descriptor.MacroName,<br class="">
+                          SuperClass->Descriptor.MacroName);<br class="">
+      }<br class="">
+    }<br class="">
<br class="">
-  OS << "#ifndef INHERITABLE_ATTR\n";<br class="">
-  OS << "#define INHERITABLE_ATTR(NAME) ATTR(NAME)\n";<br class="">
-  OS << "#endif\n\n";<br class="">
+    void emitUndefs(raw_ostream &OS) const {<br class="">
+      OS << "#undef " << Descriptor.MacroName << "\n";<br class="">
+    }<br class="">
<br class="">
-  OS << "#ifndef LAST_INHERITABLE_ATTR\n";<br class="">
-  OS << "#define LAST_INHERITABLE_ATTR(NAME) INHERITABLE_ATTR(NAME)\n";<br class="">
-  OS << "#endif\n\n";<br class="">
+    void emitAttrList(raw_ostream &OS) const {<br class="">
+      for (auto SubClass : SubClasses) {<br class="">
+        SubClass->emitAttrList(OS);<br class="">
+      }<br class="">
<br class="">
-  OS << "#ifndef INHERITABLE_PARAM_ATTR\n";<br class="">
-  OS << "#define INHERITABLE_PARAM_ATTR(NAME) ATTR(NAME)\n";<br class="">
-  OS << "#endif\n\n";<br class="">
+      ::emitAttrList(OS, Descriptor.MacroName, Attrs);<br class="">
+    }<br class="">
<br class="">
-  OS << "#ifndef LAST_INHERITABLE_PARAM_ATTR\n";<br class="">
-  OS << "#define LAST_INHERITABLE_PARAM_ATTR(NAME)"<br class="">
-        " INHERITABLE_PARAM_ATTR(NAME)\n";<br class="">
-  OS << "#endif\n\n";<br class="">
+    void classifyAttrOnRoot(Record *Attr) {<br class="">
+      bool result = classifyAttr(Attr);<br class="">
+      assert(result && "failed to classify on root"); (void) result;<br class="">
+    }<br class="">
<br class="">
-  OS << "#ifndef PRAGMA_SPELLING_ATTR\n";<br class="">
-  OS << "#define PRAGMA_SPELLING_ATTR(NAME)\n";<br class="">
-  OS << "#endif\n\n";<br class="">
+    void emitAttrRange(raw_ostream &OS) const {<br class="">
+      OS << "ATTR_RANGE(" << Descriptor.TableGenName<br class="">
+         << ", " << getFirstAttr()->getName()<br class="">
+         << ", " << getLastAttr()->getName() << ")\n";<br class="">
+    }<br class="">
<br class="">
-  OS << "#ifndef LAST_PRAGMA_SPELLING_ATTR\n";<br class="">
-  OS << "#define LAST_PRAGMA_SPELLING_ATTR(NAME) PRAGMA_SPELLING_ATTR(NAME)\n";<br class="">
-  OS << "#endif\n\n";<br class="">
+  private:<br class="">
+    bool classifyAttr(Record *Attr) {<br class="">
+      // Check all the subclasses.<br class="">
+      for (auto SubClass : SubClasses) {<br class="">
+        if (SubClass->classifyAttr(Attr))<br class="">
+          return true;<br class="">
+      }<br class="">
<br class="">
-  Record *InhClass = Records.getClass("InheritableAttr");<br class="">
-  Record *InhParamClass = Records.getClass("InheritableParamAttr");<br class="">
-  std::vector<Record *> Attrs = Records.getAllDerivedDefinitions("Attr"),<br class="">
-                        NonInhAttrs, InhAttrs, InhParamAttrs, PragmaAttrs;<br class="">
+      // It's not more specific than this class, but it might still belong here.<br class="">
+      if (Attr->isSubClassOf(TheRecord)) {<br class="">
+        Attrs.push_back(Attr);<br class="">
+        return true;<br class="">
+      }<br class="">
+<br class="">
+      return false;<br class="">
+    }<br class="">
+<br class="">
+    Record *getFirstAttr() const {<br class="">
+      if (!SubClasses.empty())<br class="">
+        return SubClasses.front()->getFirstAttr();<br class="">
+      return Attrs.front();<br class="">
+    }<br class="">
+<br class="">
+    Record *getLastAttr() const {<br class="">
+      if (!Attrs.empty())<br class="">
+        return Attrs.back();<br class="">
+      return SubClasses.back()->getLastAttr();<br class="">
+    }<br class="">
+  };<br class="">
+<br class="">
+  /// The entire hierarchy of attribute classes.<br class="">
+  class AttrClassHierarchy {<br class="">
+    std::vector<std::unique_ptr<AttrClass>> Classes;<br class="">
+  public:<br class="">
+    AttrClassHierarchy(RecordKeeper &Records) {<br class="">
+      // Find records for all the classes.<br class="">
+      for (auto &Descriptor : AttrClassDescriptors) {<br class="">
+        Record *ClassRecord = Records.getClass(Descriptor.TableGenName);<br class="">
+        AttrClass *Class = new AttrClass(Descriptor, ClassRecord);<br class="">
+        Classes.emplace_back(Class);<br class="">
+      }<br class="">
+<br class="">
+      // Link up the hierarchy.<br class="">
+      for (auto &Class : Classes) {<br class="">
+        if (AttrClass *SuperClass = findSuperClass(Class->TheRecord)) {<br class="">
+          Class->SuperClass = SuperClass;<br class="">
+          SuperClass->SubClasses.push_back(Class.get());<br class="">
+        }<br class="">
+      }<br class="">
+<br class="">
+#ifndef NDEBUG<br class="">
+      for (auto i = Classes.begin(), e = Classes.end(); i != e; ++i) {<br class="">
+        assert((i == Classes.begin()) == ((*i)->SuperClass == nullptr) &&<br class="">
+               "only the first class should be a root class!");<br class="">
+      }<br class="">
+#endif<br class="">
+    }<br class="">
+<br class="">
+    void emitDefaultDefines(raw_ostream &OS) const {<br class="">
+      for (auto &Class : Classes) {<br class="">
+        Class->emitDefaultDefines(OS);<br class="">
+      }<br class="">
+    }<br class="">
+<br class="">
+    void emitUndefs(raw_ostream &OS) const {<br class="">
+      for (auto &Class : Classes) {<br class="">
+        Class->emitUndefs(OS);<br class="">
+      }<br class="">
+    }<br class="">
+<br class="">
+    void emitAttrLists(raw_ostream &OS) const {<br class="">
+      // Just start from the root class.<br class="">
+      Classes[0]->emitAttrList(OS);<br class="">
+    }<br class="">
+<br class="">
+    void emitAttrRanges(raw_ostream &OS) const {<br class="">
+      for (auto &Class : Classes)<br class="">
+        Class->emitAttrRange(OS);<br class="">
+    }<br class="">
+<br class="">
+    void classifyAttr(Record *Attr) {<br class="">
+      // Add the attribute to the root class.<br class="">
+      Classes[0]->classifyAttrOnRoot(Attr);<br class="">
+    }<br class="">
+<br class="">
+  private:<br class="">
+    AttrClass *findClassByRecord(Record *R) const {<br class="">
+      for (auto &Class : Classes) {<br class="">
+        if (Class->TheRecord == R)<br class="">
+          return Class.get();<br class="">
+      }<br class="">
+      return nullptr;<br class="">
+    }<br class="">
+<br class="">
+    AttrClass *findSuperClass(Record *R) const {<br class="">
+      // TableGen flattens the superclass list, so we just need to walk it<br class="">
+      // in reverse.<br class="">
+      auto SuperClasses = R->getSuperClasses();<br class="">
+      for (signed i = 0, e = SuperClasses.size(); i != e; ++i) {<br class="">
+        auto SuperClass = findClassByRecord(SuperClasses[e - i - 1].first);<br class="">
+        if (SuperClass) return SuperClass;<br class="">
+      }<br class="">
+      return nullptr;<br class="">
+    }<br class="">
+  };<br class="">
+}<br class="">
+<br class="">
+namespace clang {<br class="">
+// Emits the enumeration list for attributes.<br class="">
+void EmitClangAttrList(RecordKeeper &Records, raw_ostream &OS) {<br class="">
+  emitSourceFileHeader("List of all attributes that Clang recognizes", OS);<br class="">
+<br class="">
+  AttrClassHierarchy Hierarchy(Records);<br class="">
+<br class="">
+  // Add defaulting macro definitions.<br class="">
+  Hierarchy.emitDefaultDefines(OS);<br class="">
+  emitDefaultDefine(OS, "PRAGMA_SPELLING_ATTR", nullptr);<br class="">
+<br class="">
+  std::vector<Record *> Attrs = Records.getAllDerivedDefinitions("Attr");<br class="">
+  std::vector<Record *> PragmaAttrs;<br class="">
   for (auto *Attr : Attrs) {<br class="">
     if (!Attr->getValueAsBit("ASTNode"))<br class="">
       continue;<br class="">
<br class="">
+    // Add the attribute to the ad-hoc groups.<br class="">
     if (AttrHasPragmaSpelling(Attr))<br class="">
       PragmaAttrs.push_back(Attr);<br class="">
<br class="">
-    if (Attr->isSubClassOf(InhParamClass))<br class="">
-      InhParamAttrs.push_back(Attr);<br class="">
-    else if (Attr->isSubClassOf(InhClass))<br class="">
-      InhAttrs.push_back(Attr);<br class="">
-    else<br class="">
-      NonInhAttrs.push_back(Attr);<br class="">
+    // Place it in the hierarchy.<br class="">
+    Hierarchy.classifyAttr(Attr);<br class="">
   }<br class="">
<br class="">
-  EmitAttrList(OS, "PRAGMA_SPELLING_ATTR", PragmaAttrs);<br class="">
-  EmitAttrList(OS, "INHERITABLE_PARAM_ATTR", InhParamAttrs);<br class="">
-  EmitAttrList(OS, "INHERITABLE_ATTR", InhAttrs);<br class="">
-  EmitAttrList(OS, "ATTR", NonInhAttrs);<br class="">
-<br class="">
-  OS << "#undef LAST_ATTR\n";<br class="">
-  OS << "#undef INHERITABLE_ATTR\n";<br class="">
-  OS << "#undef LAST_INHERITABLE_ATTR\n";<br class="">
-  OS << "#undef LAST_INHERITABLE_PARAM_ATTR\n";<br class="">
-  OS << "#undef LAST_PRAGMA_ATTR\n";<br class="">
+  // Emit the main attribute list.<br class="">
+  Hierarchy.emitAttrLists(OS);<br class="">
+<br class="">
+  // Emit the ad hoc groups.<br class="">
+  emitAttrList(OS, "PRAGMA_SPELLING_ATTR", PragmaAttrs);<br class="">
+<br class="">
+  // Emit the attribute ranges.<br class="">
+  OS << "#ifdef ATTR_RANGE\n";<br class="">
+  Hierarchy.emitAttrRanges(OS);<br class="">
+  OS << "#undef ATTR_RANGE\n";<br class="">
+  OS << "#endif\n";<br class="">
+<br class="">
+  Hierarchy.emitUndefs(OS);<br class="">
   OS << "#undef PRAGMA_SPELLING_ATTR\n";<br class="">
-  OS << "#undef ATTR\n";<br class="">
 }<br class="">
<br class="">
 // Emits the code to read an attribute from a precompiled header.<br class="">
@@ -1841,8 +1974,6 @@ void EmitClangAttrPCHRead(RecordKeeper &<br class="">
   std::vector<std::unique_ptr<Argument>> Args;<br class="">
<br class="">
   OS << "  switch (Kind) {\n";<br class="">
-  OS << "  default:\n";<br class="">
-  OS << "    llvm_unreachable(\"Unknown attribute!\");\n";<br class="">
   for (const auto *Attr : Attrs) {<br class="">
     const Record &R = *Attr;<br class="">
     if (!R.getValueAsBit("ASTNode"))<br class="">
@@ -1882,9 +2013,6 @@ void EmitClangAttrPCHWrite(RecordKeeper<br class="">
   std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"), Args;<br class="">
<br class="">
   OS << "  switch (A->getKind()) {\n";<br class="">
-  OS << "  default:\n";<br class="">
-  OS << "    llvm_unreachable(\"Unknown attribute kind!\");\n";<br class="">
-  OS << "    break;\n";<br class="">
   for (const auto *Attr : Attrs) {<br class="">
     const Record &R = *Attr;<br class="">
     if (!R.getValueAsBit("ASTNode"))<br class="">
@@ -2075,11 +2203,7 @@ void EmitClangAttrSpellingListIndex(Reco<br class="">
   emitSourceFileHeader("Code to translate different attribute spellings "<br class="">
                        "into internal identifiers", OS);<br class="">
<br class="">
-  OS <<<br class="">
-    "  switch (AttrKind) {\n"<br class="">
-    "  default:\n"<br class="">
-    "    llvm_unreachable(\"Unknown attribute kind!\");\n"<br class="">
-    "    break;\n";<br class="">
+  OS << "  switch (AttrKind) {\n";<br class="">
<br class="">
   ParsedAttrMap Attrs = getParsedAttrList(Records);<br class="">
   for (const auto &I : Attrs) {<br class="">
@@ -2159,9 +2283,7 @@ void EmitClangAttrASTVisitor(RecordKeepe<br class="">
      << "  if (!A)\n"<br class="">
      << "    return true;\n"<br class="">
      << "\n"<br class="">
-     << "  switch (A->getKind()) {\n"<br class="">
-     << "    default:\n"<br class="">
-     << "      return true;\n";<br class="">
+     << "  switch (A->getKind()) {\n";<br class="">
<br class="">
   for (const auto *Attr : Attrs) {<br class="">
     const Record &R = *Attr;<br class="">
@@ -2188,9 +2310,7 @@ void EmitClangAttrTemplateInstantiate(Re<br class="">
      << "Attr *instantiateTemplateAttribute(const Attr *At, ASTContext &C, "<br class="">
      << "Sema &S,\n"<br class="">
      << "        const MultiLevelTemplateArgumentList &TemplateArgs) {\n"<br class="">
-     << "  switch (At->getKind()) {\n"<br class="">
-     << "    default:\n"<br class="">
-     << "      break;\n";<br class="">
+     << "  switch (At->getKind()) {\n";<br class="">
<br class="">
   for (const auto *Attr : Attrs) {<br class="">
     const Record &R = *Attr;<br class="">
@@ -2788,11 +2908,7 @@ void EmitClangAttrParsedAttrKinds(Record<br class="">
 void EmitClangAttrDump(RecordKeeper &Records, raw_ostream &OS) {<br class="">
   emitSourceFileHeader("Attribute dumper", OS);<br class="">
<br class="">
-  OS <<<br class="">
-    "  switch (A->getKind()) {\n"<br class="">
-    "  default:\n"<br class="">
-    "    llvm_unreachable(\"Unknown attribute kind!\");\n"<br class="">
-    "    break;\n";<br class="">
+  OS << "  switch (A->getKind()) {\n";<br class="">
   std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"), Args;<br class="">
   for (const auto *Attr : Attrs) {<br class="">
     const Record &R = *Attr;<br class="">
<br class="">
<br class="">
_______________________________________________<br class="">
cfe-commits mailing list<br class="">
<a href="mailto:cfe-commits@lists.llvm.org" class="">cfe-commits@lists.llvm.org</a><br class="">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank" class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br class="">
</blockquote></div><br class=""></div>
</div></blockquote></div><br class=""></body></html>