Fixed some issues that resulted in erroneous duplicate symbol error messages.

llvm-svn: 189228
diff --git a/clang-tools-extra/modularize/Modularize.cpp b/clang-tools-extra/modularize/Modularize.cpp
index 823165bb..c1bba91 100644
--- a/clang-tools-extra/modularize/Modularize.cpp
+++ b/clang-tools-extra/modularize/Modularize.cpp
@@ -418,13 +418,23 @@
     if (isa<NamespaceDecl>(ND) || isa<UsingDirectiveDecl>(ND) ||
         isa<NamespaceAliasDecl>(ND) ||
         isa<ClassTemplateSpecializationDecl>(ND) || isa<UsingDecl>(ND) ||
+        isa<ClassTemplateDecl>(ND) || isa<TemplateTypeParmDecl>(ND) ||
+        isa<TypeAliasTemplateDecl>(ND) ||
         isa<UsingShadowDecl>(ND) || isa<FunctionDecl>(ND) ||
         isa<FunctionTemplateDecl>(ND) ||
         (isa<TagDecl>(ND) &&
          !cast<TagDecl>(ND)->isThisDeclarationADefinition()))
       return true;
 
-    std::string Name = ND->getNameAsString();
+    // Skip anonymous declarations.
+    if (!ND->getDeclName())
+      return true;
+
+    // Get the qualified name.
+    std::string Name;

+    llvm::raw_string_ostream OS(Name);

+    ND->printQualifiedName(OS);

+    OS.flush();

     if (Name.empty())
       return true;
 
diff --git a/clang-tools-extra/test/modularize/Inputs/Anonymous.h b/clang-tools-extra/test/modularize/Inputs/Anonymous.h
new file mode 100644
index 0000000..8388eca
--- /dev/null
+++ b/clang-tools-extra/test/modularize/Inputs/Anonymous.h
@@ -0,0 +1,11 @@
+// Exercise some anonymous type issues.
+
+// Anonymous enum.
+enum {
+  Tag1
+};
+
+// Anonymous enum typedef.
+typedef enum {
+  Tag2
+} AnonymousEnum;
diff --git a/clang-tools-extra/test/modularize/Inputs/NamespaceClasses.h b/clang-tools-extra/test/modularize/Inputs/NamespaceClasses.h
new file mode 100644
index 0000000..57e6091
--- /dev/null
+++ b/clang-tools-extra/test/modularize/Inputs/NamespaceClasses.h
@@ -0,0 +1,20 @@
+// Define same class name in different namespaces.
+
+namespace Namespace1 {
+  class NamespaceClass {
+  public:
+    NamespaceClass() : Member(0) {}
+  private:
+    int Member;
+  };
+}
+
+namespace Namespace2 {
+  class NamespaceClass {
+  public:
+    NamespaceClass() : Member(0) {}
+  private:
+    int Member;
+  };
+}
+
diff --git a/clang-tools-extra/test/modularize/Inputs/SomeTypes.h b/clang-tools-extra/test/modularize/Inputs/SomeTypes.h
index c5c7e7a..46c4316 100644
--- a/clang-tools-extra/test/modularize/Inputs/SomeTypes.h
+++ b/clang-tools-extra/test/modularize/Inputs/SomeTypes.h
@@ -14,25 +14,3 @@
 private:
   int Member;
 };
-
-/*
-This currently doesn't work.  Can't handle same name in different namespaces.
-namespace Namespace1 {
-  class NamespaceClass {
-  public:
-    NamespaceClass() : Member(0) {}
-  private:
-    int Member;
-  };
-}
-
-namespace Namespace2 {
-  class NamespaceClass {
-  public:
-    NamespaceClass() : Member(0) {}
-  private:
-    int Member;
-  };
-}
-*/
-
diff --git a/clang-tools-extra/test/modularize/Inputs/TemplateClasses.h b/clang-tools-extra/test/modularize/Inputs/TemplateClasses.h
new file mode 100644
index 0000000..3eab6d9
--- /dev/null
+++ b/clang-tools-extra/test/modularize/Inputs/TemplateClasses.h
@@ -0,0 +1,15 @@
+// Exercise some template issues.  Should not produce errors.
+
+// Forward declaration.
+template<class T> class TemplateClass;
+
+// Full declaration.
+template<class T>class TemplateClass {
+public:
+  TemplateClass() {}
+private:
+  T Member;
+};
+
+// Template alias.
+template<class T> using TemplateClassAlias = TemplateClass<T>;
diff --git a/clang-tools-extra/test/modularize/NoProblemsAnonymous.modularize b/clang-tools-extra/test/modularize/NoProblemsAnonymous.modularize
new file mode 100644
index 0000000..20b1898
--- /dev/null
+++ b/clang-tools-extra/test/modularize/NoProblemsAnonymous.modularize
@@ -0,0 +1,3 @@
+# RUN: modularize %s -x c++
+
+Inputs/Anonymous.h
diff --git a/clang-tools-extra/test/modularize/NoProblemsNamespaceClasses.modularize b/clang-tools-extra/test/modularize/NoProblemsNamespaceClasses.modularize
new file mode 100644
index 0000000..1d02c78
--- /dev/null
+++ b/clang-tools-extra/test/modularize/NoProblemsNamespaceClasses.modularize
@@ -0,0 +1,3 @@
+# RUN: modularize %s -x c++
+
+Inputs/NamespaceClasses.h
diff --git a/clang-tools-extra/test/modularize/NoProblemsTemplateClasses.modularize b/clang-tools-extra/test/modularize/NoProblemsTemplateClasses.modularize
new file mode 100644
index 0000000..d41c43c
--- /dev/null
+++ b/clang-tools-extra/test/modularize/NoProblemsTemplateClasses.modularize
@@ -0,0 +1,3 @@
+# RUN: modularize %s -x c++
+
+Inputs/TemplateClasses.h