[PATCH] D33010: Make google-build-using-namespace skip std::.*literals

2017-05-13 Thread Martin Ejdestig via Phabricator via cfe-commits
marejde updated this revision to Diff 98893.
marejde added a comment.

Removed use of getQualifiedNameAsString().


https://reviews.llvm.org/D33010

Files:
  clang-tidy/google/UsingNamespaceDirectiveCheck.cpp
  clang-tidy/google/UsingNamespaceDirectiveCheck.h
  test/clang-tidy/google-namespaces.cpp


Index: test/clang-tidy/google-namespaces.cpp
===
--- test/clang-tidy/google-namespaces.cpp
+++ test/clang-tidy/google-namespaces.cpp
@@ -6,3 +6,31 @@
 // CHECK: :[[@LINE-1]]:1: warning: do not use namespace using-directives; use 
using-declarations instead [google-build-using-namespace]
 
 using spce::core; // no-warning
+
+namespace std {
+inline namespace literals {
+inline namespace chrono_literals {
+}
+inline namespace complex_literals {
+}
+inline namespace string_literals {
+}
+}
+}
+
+using namespace std::chrono_literals;// no-warning
+using namespace std::complex_literals;   // no-warning
+using namespace std::literals;   // no-warning
+using namespace std::literals::chrono_literals;  // no-warning
+using namespace std::literals::complex_literals; // no-warning
+using namespace std::literals::string_literals;  // no-warning
+using namespace std::string_literals;// no-warning
+
+namespace literals {}
+namespace foo::literals {}
+
+using namespace literals;
+// CHECK: :[[@LINE-1]]:1: warning: do not use namespace using-directives; use 
using-declarations instead [google-build-using-namespace]
+
+using namespace foo::literals;
+// CHECK: :[[@LINE-1]]:1: warning: do not use namespace using-directives; use 
using-declarations instead [google-build-using-namespace]
Index: clang-tidy/google/UsingNamespaceDirectiveCheck.h
===
--- clang-tidy/google/UsingNamespaceDirectiveCheck.h
+++ clang-tidy/google/UsingNamespaceDirectiveCheck.h
@@ -38,6 +38,9 @@
   : ClangTidyCheck(Name, Context) {}
   void registerMatchers(ast_matchers::MatchFinder *Finder) override;
   void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
+
+private:
+  bool isStdLiteralsNamespace(const NamespaceDecl *NS);
 };
 
 } // namespace build
Index: clang-tidy/google/UsingNamespaceDirectiveCheck.cpp
===
--- clang-tidy/google/UsingNamespaceDirectiveCheck.cpp
+++ clang-tidy/google/UsingNamespaceDirectiveCheck.cpp
@@ -34,12 +34,32 @@
   if (U->isImplicit() || !Loc.isValid())
 return;
 
+  // Do not warn if namespace is a std namespace with user-defined literals. 
The
+  // user-defined literals can only be used with a using directive.
+  if (isStdLiteralsNamespace(U->getNominatedNamespace()))
+return;
+
   diag(Loc, "do not use namespace using-directives; "
 "use using-declarations instead");
   // TODO: We could suggest a list of using directives replacing the using
   //   namespace directive.
 }
 
+bool UsingNamespaceDirectiveCheck::isStdLiteralsNamespace(
+const NamespaceDecl *NS) {
+  if (!NS->getName().endswith("literals"))
+return false;
+
+  const auto *Parent = dyn_cast_or_null(NS->getParent());
+  if (!Parent)
+return false;
+
+  if (Parent->isStdNamespace())
+return true;
+
+  return Parent->getName() == "literals" && Parent->getParent() &&
+ Parent->getParent()->isStdNamespace();
+}
 } // namespace build
 } // namespace google
 } // namespace tidy


Index: test/clang-tidy/google-namespaces.cpp
===
--- test/clang-tidy/google-namespaces.cpp
+++ test/clang-tidy/google-namespaces.cpp
@@ -6,3 +6,31 @@
 // CHECK: :[[@LINE-1]]:1: warning: do not use namespace using-directives; use using-declarations instead [google-build-using-namespace]
 
 using spce::core; // no-warning
+
+namespace std {
+inline namespace literals {
+inline namespace chrono_literals {
+}
+inline namespace complex_literals {
+}
+inline namespace string_literals {
+}
+}
+}
+
+using namespace std::chrono_literals;// no-warning
+using namespace std::complex_literals;   // no-warning
+using namespace std::literals;   // no-warning
+using namespace std::literals::chrono_literals;  // no-warning
+using namespace std::literals::complex_literals; // no-warning
+using namespace std::literals::string_literals;  // no-warning
+using namespace std::string_literals;// no-warning
+
+namespace literals {}
+namespace foo::literals {}
+
+using namespace literals;
+// CHECK: :[[@LINE-1]]:1: warning: do not use namespace using-directives; use using-declarations instead [google-build-using-namespace]
+
+using namespace foo::literals;
+// CHECK: :[[@LINE-1]]:1: warning: do not use namespace using-directives; use using-declarations instead [google-build-using-namespace]
Index: clang-tidy/google/UsingNamespaceDirectiveCheck.h
=

[PATCH] D33010: Make google-build-using-namespace skip std::.*literals

2017-05-14 Thread Martin Ejdestig via Phabricator via cfe-commits
marejde updated this revision to Diff 98914.
marejde added a comment.

Removed use of nested namespace definition in test (C++17) and added a couple 
of more namespaces with "literals" in name that check should warn for.


https://reviews.llvm.org/D33010

Files:
  clang-tidy/google/UsingNamespaceDirectiveCheck.cpp
  clang-tidy/google/UsingNamespaceDirectiveCheck.h
  test/clang-tidy/google-namespaces.cpp

Index: test/clang-tidy/google-namespaces.cpp
===
--- test/clang-tidy/google-namespaces.cpp
+++ test/clang-tidy/google-namespaces.cpp
@@ -6,3 +6,47 @@
 // CHECK: :[[@LINE-1]]:1: warning: do not use namespace using-directives; use using-declarations instead [google-build-using-namespace]
 
 using spce::core; // no-warning
+
+namespace std {
+inline namespace literals {
+inline namespace chrono_literals {
+}
+inline namespace complex_literals {
+}
+inline namespace string_literals {
+}
+}
+}
+
+using namespace std::chrono_literals;// no-warning
+using namespace std::complex_literals;   // no-warning
+using namespace std::literals;   // no-warning
+using namespace std::literals::chrono_literals;  // no-warning
+using namespace std::literals::complex_literals; // no-warning
+using namespace std::literals::string_literals;  // no-warning
+using namespace std::string_literals;// no-warning
+
+namespace literals {}
+
+using namespace literals;
+// CHECK: :[[@LINE-1]]:1: warning: do not use namespace using-directives; use using-declarations instead [google-build-using-namespace]
+
+namespace foo {
+inline namespace literals {
+inline namespace bar_literals {}
+}
+}
+
+using namespace foo::literals;
+// CHECK: :[[@LINE-1]]:1: warning: do not use namespace using-directives; use using-declarations instead [google-build-using-namespace]
+
+using namespace foo::bar_literals;
+// CHECK: :[[@LINE-1]]:1: warning: do not use namespace using-directives; use using-declarations instead [google-build-using-namespace]
+
+using namespace foo::literals::bar_literals;
+// CHECK: :[[@LINE-1]]:1: warning: do not use namespace using-directives; use using-declarations instead [google-build-using-namespace]
+
+namespace foo_literals {}
+
+using namespace foo_literals;
+// CHECK: :[[@LINE-1]]:1: warning: do not use namespace using-directives; use using-declarations instead [google-build-using-namespace]
Index: clang-tidy/google/UsingNamespaceDirectiveCheck.h
===
--- clang-tidy/google/UsingNamespaceDirectiveCheck.h
+++ clang-tidy/google/UsingNamespaceDirectiveCheck.h
@@ -38,6 +38,9 @@
   : ClangTidyCheck(Name, Context) {}
   void registerMatchers(ast_matchers::MatchFinder *Finder) override;
   void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
+
+private:
+  bool isStdLiteralsNamespace(const NamespaceDecl *NS);
 };
 
 } // namespace build
Index: clang-tidy/google/UsingNamespaceDirectiveCheck.cpp
===
--- clang-tidy/google/UsingNamespaceDirectiveCheck.cpp
+++ clang-tidy/google/UsingNamespaceDirectiveCheck.cpp
@@ -34,12 +34,32 @@
   if (U->isImplicit() || !Loc.isValid())
 return;
 
+  // Do not warn if namespace is a std namespace with user-defined literals. The
+  // user-defined literals can only be used with a using directive.
+  if (isStdLiteralsNamespace(U->getNominatedNamespace()))
+return;
+
   diag(Loc, "do not use namespace using-directives; "
 "use using-declarations instead");
   // TODO: We could suggest a list of using directives replacing the using
   //   namespace directive.
 }
 
+bool UsingNamespaceDirectiveCheck::isStdLiteralsNamespace(
+const NamespaceDecl *NS) {
+  if (!NS->getName().endswith("literals"))
+return false;
+
+  const auto *Parent = dyn_cast_or_null(NS->getParent());
+  if (!Parent)
+return false;
+
+  if (Parent->isStdNamespace())
+return true;
+
+  return Parent->getName() == "literals" && Parent->getParent() &&
+ Parent->getParent()->isStdNamespace();
+}
 } // namespace build
 } // namespace google
 } // namespace tidy
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D33010: Make google-build-using-namespace skip std::.*literals

2017-05-15 Thread Martin Ejdestig via Phabricator via cfe-commits
marejde updated this revision to Diff 99011.
marejde added a comment.

Modified isStdLiteralsNamespace() to be a static method.


https://reviews.llvm.org/D33010

Files:
  clang-tidy/google/UsingNamespaceDirectiveCheck.cpp
  clang-tidy/google/UsingNamespaceDirectiveCheck.h
  test/clang-tidy/google-namespaces.cpp

Index: test/clang-tidy/google-namespaces.cpp
===
--- test/clang-tidy/google-namespaces.cpp
+++ test/clang-tidy/google-namespaces.cpp
@@ -6,3 +6,47 @@
 // CHECK: :[[@LINE-1]]:1: warning: do not use namespace using-directives; use using-declarations instead [google-build-using-namespace]
 
 using spce::core; // no-warning
+
+namespace std {
+inline namespace literals {
+inline namespace chrono_literals {
+}
+inline namespace complex_literals {
+}
+inline namespace string_literals {
+}
+}
+}
+
+using namespace std::chrono_literals;// no-warning
+using namespace std::complex_literals;   // no-warning
+using namespace std::literals;   // no-warning
+using namespace std::literals::chrono_literals;  // no-warning
+using namespace std::literals::complex_literals; // no-warning
+using namespace std::literals::string_literals;  // no-warning
+using namespace std::string_literals;// no-warning
+
+namespace literals {}
+
+using namespace literals;
+// CHECK: :[[@LINE-1]]:1: warning: do not use namespace using-directives; use using-declarations instead [google-build-using-namespace]
+
+namespace foo {
+inline namespace literals {
+inline namespace bar_literals {}
+}
+}
+
+using namespace foo::literals;
+// CHECK: :[[@LINE-1]]:1: warning: do not use namespace using-directives; use using-declarations instead [google-build-using-namespace]
+
+using namespace foo::bar_literals;
+// CHECK: :[[@LINE-1]]:1: warning: do not use namespace using-directives; use using-declarations instead [google-build-using-namespace]
+
+using namespace foo::literals::bar_literals;
+// CHECK: :[[@LINE-1]]:1: warning: do not use namespace using-directives; use using-declarations instead [google-build-using-namespace]
+
+namespace foo_literals {}
+
+using namespace foo_literals;
+// CHECK: :[[@LINE-1]]:1: warning: do not use namespace using-directives; use using-declarations instead [google-build-using-namespace]
Index: clang-tidy/google/UsingNamespaceDirectiveCheck.h
===
--- clang-tidy/google/UsingNamespaceDirectiveCheck.h
+++ clang-tidy/google/UsingNamespaceDirectiveCheck.h
@@ -38,6 +38,9 @@
   : ClangTidyCheck(Name, Context) {}
   void registerMatchers(ast_matchers::MatchFinder *Finder) override;
   void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
+
+private:
+  static bool isStdLiteralsNamespace(const NamespaceDecl *NS);
 };
 
 } // namespace build
Index: clang-tidy/google/UsingNamespaceDirectiveCheck.cpp
===
--- clang-tidy/google/UsingNamespaceDirectiveCheck.cpp
+++ clang-tidy/google/UsingNamespaceDirectiveCheck.cpp
@@ -34,12 +34,32 @@
   if (U->isImplicit() || !Loc.isValid())
 return;
 
+  // Do not warn if namespace is a std namespace with user-defined literals. The
+  // user-defined literals can only be used with a using directive.
+  if (isStdLiteralsNamespace(U->getNominatedNamespace()))
+return;
+
   diag(Loc, "do not use namespace using-directives; "
 "use using-declarations instead");
   // TODO: We could suggest a list of using directives replacing the using
   //   namespace directive.
 }
 
+bool UsingNamespaceDirectiveCheck::isStdLiteralsNamespace(
+const NamespaceDecl *NS) {
+  if (!NS->getName().endswith("literals"))
+return false;
+
+  const auto *Parent = dyn_cast_or_null(NS->getParent());
+  if (!Parent)
+return false;
+
+  if (Parent->isStdNamespace())
+return true;
+
+  return Parent->getName() == "literals" && Parent->getParent() &&
+ Parent->getParent()->isStdNamespace();
+}
 } // namespace build
 } // namespace google
 } // namespace tidy
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D33010: Make google-build-using-namespace skip std::.*literals

2017-05-15 Thread Martin Ejdestig via Phabricator via cfe-commits
marejde added a comment.

> Do you need me to commit the patch for you?

Yes please. I do not have commit access.




Comment at: clang-tidy/google/UsingNamespaceDirectiveCheck.cpp:48
 
+bool UsingNamespaceDirectiveCheck::isStdLiteralsNamespace(
+const NamespaceDecl *NS) {

alexfh wrote:
> Please make this a static free function instead, since it doesn't need access 
> to the check's members.
Done.


https://reviews.llvm.org/D33010



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits