Author: aaronballman
Date: Thu Jan 16 13:44:01 2014
New Revision: 199414

URL: http://llvm.org/viewvc/llvm-project?rev=199414&view=rev
Log:
When generating Spelling enumeration values, do not generate identifiers in the 
reserved namespace. Strip underscores as appropriate, taking care to not create 
duplicate identifiers.

Modified:
    cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp

Modified: cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp?rev=199414&r1=199413&r2=199414&view=diff
==============================================================================
--- cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp (original)
+++ cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp Thu Jan 16 13:44:01 2014
@@ -1200,7 +1200,12 @@ void EmitClangAttrClass(RecordKeeper &Re
                          SpellingNamesAreCommon(Spellings);
 
     if (!ElideSpelling) {
+      // The enumerants are automatically generated based on the variety,
+      // namespace (if present) and name for each attribute spelling. However,
+      // care is taken to avoid trampling on the reserved namespace due to
+      // underscores.
       OS << "  enum Spelling {\n";
+      std::set<std::string> Uniques;
       for (std::vector<Record *>::const_iterator I = Spellings.begin(),
            E = Spellings.end(); I != E; ++I) {
         if (I != Spellings.begin())
@@ -1209,14 +1214,25 @@ void EmitClangAttrClass(RecordKeeper &Re
         std::string Variety = S.getValueAsString("Variety");
         std::string Spelling = S.getValueAsString("Name");
         std::string Namespace = "";
+        std::string EnumName = "";
 
         if (Variety == "CXX11")
           Namespace = S.getValueAsString("Namespace");
 
-        OS << "    " << Variety << "_";
+        EnumName += (Variety + "_");
         if (!Namespace.empty())
-          OS << Namespace << "_";
-        OS << Spelling;
+          EnumName += (NormalizeNameForSpellingComparison(Namespace).str() +
+                      "_");
+        EnumName += NormalizeNameForSpellingComparison(Spelling);
+
+        // Since we have been stripping underscores to avoid trampling on the
+        // reserved namespace, we may have inadvertantly created duplicate
+        // enumerant names. Unique the name if required.
+        while (Uniques.find(EnumName) != Uniques.end())
+          EnumName += "_alternate";
+        Uniques.insert(EnumName);
+
+        OS << "    " << EnumName;
       }
       OS << "\n  };\n\n";
     }


_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to