[clang-tidy] Add a checker that warns on const string & members.

Summary:
Those are considered unsafe and should be replaced with simple pointers or
full copies. It recognizes both std::string and ::string.

Reviewers: alexfh, djasper

Subscribers: cfe-commits

Differential Revision: http://reviews.llvm.org/D4522

llvm-svn: 213133
diff --git a/clang-tools-extra/test/clang-tidy/google-member-string-references.cpp b/clang-tools-extra/test/clang-tidy/google-member-string-references.cpp
new file mode 100644
index 0000000..1536bad
--- /dev/null
+++ b/clang-tools-extra/test/clang-tidy/google-member-string-references.cpp
@@ -0,0 +1,49 @@
+// RUN: clang-tidy %s -checks='-*,google-runtime-member-string-references' -- | FileCheck %s -implicit-check-not="{{warning|error}}:"
+
+namespace std {
+template<typename T>
+  class basic_string {};
+
+typedef basic_string<char> string;
+}
+
+class string {};
+
+
+struct A {
+  const std::string &s;
+// CHECK: :[[@LINE-1]]:3: warning: const string& members are dangerous. It is much better to use alternatives, such as pointers or simple constants.
+};
+
+struct B {
+  std::string &s;
+};
+
+struct C {
+  const std::string s;
+};
+
+template <typename T>
+struct D {
+  D();
+  const T &s;
+  const std::string &s2;
+// CHECK: :[[@LINE-1]]:3: warning: const string& members are dangerous. It is much better to use alternatives, such as pointers or simple constants.
+};
+
+D<std::string> d;
+
+struct AA {
+  const string &s;
+// CHECK: :[[@LINE-1]]:3: warning: const string& members are dangerous. It is much better to use alternatives, such as pointers or simple constants.
+};
+
+struct BB {
+  string &s;
+};
+
+struct CC {
+  const string s;
+};
+
+D<string> dd;