Invalidate a field of struct type by setting its default value to conjured 
symbol.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@74408 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/CFRefCount.cpp b/lib/Analysis/CFRefCount.cpp
index f4a28e0..1010b65 100644
--- a/lib/Analysis/CFRefCount.cpp
+++ b/lib/Analysis/CFRefCount.cpp
@@ -2863,14 +2863,25 @@
                 // For now just handle scalar fields.
                 FieldDecl *FD = *FI;
                 QualType FT = FD->getType();
-                
+                const FieldRegion* FR = MRMgr.getFieldRegion(FD, R);
+
                 if (Loc::IsLocType(FT) || 
                     (FT->isIntegerType() && FT->isScalarType())) {
-                  const FieldRegion* FR = MRMgr.getFieldRegion(FD, R);
-
                   SVal V = ValMgr.getConjuredSymbolVal(*I, FT, Count);
                   state = state->bindLoc(ValMgr.makeLoc(FR), V);
-                }                
+                }
+                else if (FT->isStructureType()) {
+                  // set the default value of the struct field to conjured
+                  // symbol. Note that the type of the symbol is irrelavant.
+                  // We cannot use the type of the struct otherwise ValMgr won't
+                  // give us the conjured symbol.
+                  StoreManager& StoreMgr = 
+                    Eng.getStateManager().getStoreManager();
+                  SVal V = ValMgr.getConjuredSymbolVal(*I, 
+                                                       Eng.getContext().IntTy,
+                                                       Count);
+                  state = StoreMgr.setDefaultValue(state, FR, V);
+                }
               }
             } else if (const ArrayType *AT = Ctx.getAsArrayType(T)) {
               // Set the default value of the array to conjured symbol.
diff --git a/test/Analysis/array-struct.c b/test/Analysis/array-struct.c
index 438e1cc..4e888c8 100644
--- a/test/Analysis/array-struct.c
+++ b/test/Analysis/array-struct.c
@@ -157,3 +157,14 @@
 void f16(struct s3 *p) {
   struct s3 a = *((struct s3*) ((char*) &p[0]));
 }
+
+void inv(struct s1 *);
+
+// Invalidate the struct field.
+void f17() {
+  struct s1 t;
+  int x;
+  inv(&t);
+  if (t.e.d)
+    x = 1;
+}