Index: test/SemaCXX/uninitialized.cpp
===================================================================
--- test/SemaCXX/uninitialized.cpp	(revision 161345)
+++ test/SemaCXX/uninitialized.cpp	(working copy)
@@ -12,13 +12,13 @@
 int c = (c + c); // expected-warning 2 {{variable 'c' is uninitialized when used within its own initialization}}
 int e = static_cast<long>(e) + 1; // expected-warning {{variable 'e' is uninitialized when used within its own initialization}}
 int f = foo(f); // expected-warning {{variable 'f' is uninitialized when used within its own initialization}}
+int g = boo(g);  // expected-warning{{variable 'g' is uninitialized when used within its own initialization}}
+int h = far(h);  // expected-warning{{variable 'h' is uninitialized when used within its own initialization}}
 
 // Thes don't warn as they don't require the value.
-int g = sizeof(g);
+int i = sizeof(i);
 void* ptr = &ptr;
-int h = bar(&h);
-int i = boo(i);
-int j = far(j);
+int j = bar(&j);
 int k = __alignof__(k);
 
 int l = k ? l : l;  // expected-warning 2{{variable 'l' is uninitialized when used within its own initialization}}
@@ -316,3 +316,21 @@
     G(char (*)[8]) : f3(new F(f3->*ptr)) {} // expected-warning {{field is uninitialized when used here}}
   };
 }
+
+class string {
+  public:
+    string();
+    string(const char*);
+    string(const string&);
+};
+string operator+(const string&, const string&);
+string test(string&);
+
+string StringA = "start " + StringA + " end";  // expected-warning {{variable 'StringA' is uninitialized when used within its own initialization}}
+const string StringB = "start " + StringB + " end";  // expected-warning {{variable 'StringB' is uninitialized when used within its own initialization}}
+string StringC = test(StringC);  // expected-warning {{variable 'StringC' is uninitialized when used within its own initialization}}
+void stringTest() {
+  string StringA = "start " + StringA + " end";  // expected-warning {{variable 'StringA' is uninitialized when used within its own initialization}}
+  const string StringB = "start " + StringB + " end";  // expected-warning {{variable 'StringB' is uninitialized when used within its own initialization}}
+  string StringC = test(StringC);  // expected-warning {{variable 'StringC' is uninitialized when used within its own initialization}}
+}
Index: lib/Sema/SemaDecl.cpp
===================================================================
--- lib/Sema/SemaDecl.cpp	(revision 161345)
+++ lib/Sema/SemaDecl.cpp	(working copy)
@@ -6223,7 +6223,7 @@
 
     void VisitImplicitCastExpr(ImplicitCastExpr *E) {
       if ((!isRecordType && E->getCastKind() == CK_LValueToRValue) ||
-          (isRecordType && E->getCastKind() == CK_NoOp))
+          (E->getCastKind() == CK_NoOp))
         HandleValue(E->getSubExpr());
 
       Inherited::VisitImplicitCastExpr(E);
@@ -6254,6 +6254,16 @@
 
     void VisitObjCMessageExpr(ObjCMessageExpr *E) { return; }
 
+    // Catch when variables are passed by reference to a fuction.
+    void VisitCallExpr(CallExpr *E) {
+      for (CallExpr::arg_iterator I = E->arg_begin(), End = E->arg_end();
+           I != End; ++I)
+        if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(*I))
+          HandleDeclRefExpr(DRE);
+
+      Inherited::VisitCallExpr(E);
+    }
+
     void HandleDeclRefExpr(DeclRefExpr *DRE) {
       Decl* ReferenceDecl = DRE->getDecl(); 
       if (OrigDecl != ReferenceDecl) return;
