If data is ever invalid, set val to zero value
diff --git a/mapstructure.go b/mapstructure.go
index 7533b2c..83676f2 100644
--- a/mapstructure.go
+++ b/mapstructure.go
@@ -53,6 +53,14 @@
 
 // Decodes an unknown data type into a specific reflection value.
 func decode(name string, data interface{}, val reflect.Value) error {
+	dataVal := reflect.ValueOf(data)
+	if !dataVal.IsValid() {
+		// If the data value is invalid, then we just set the value
+		// to be the zero value.
+		val.Set(reflect.Zero(val.Type()))
+		return nil
+	}
+
 	k := val.Kind()
 
 	// Some shortcuts because we treat all ints and uints the same way
@@ -89,12 +97,6 @@
 // value to "data" of that type.
 func decodeBasic(name string, data interface{}, val reflect.Value) error {
 	dataVal := reflect.ValueOf(data)
-	if !dataVal.IsValid() {
-		// If the data isn't valid (the zero type), then we set the
-		// value to be the zero type of the field we want to set.
-		dataVal = reflect.Zero(val.Type())
-	}
-
 	dataValType := dataVal.Type()
 	if !dataValType.AssignableTo(val.Type()) {
 		return fmt.Errorf(
@@ -108,11 +110,6 @@
 
 func decodeInt(name string, data interface{}, val reflect.Value) error {
 	dataVal := reflect.ValueOf(data)
-	if !dataVal.IsValid() {
-		// This should never happen
-		panic("data is invalid")
-	}
-
 	dataKind := dataVal.Kind()
 	if dataKind >= reflect.Int && dataKind <= reflect.Int64 {
 		dataKind = reflect.Int
diff --git a/mapstructure_bugs_test.go b/mapstructure_bugs_test.go
index 28a4940..05d7e3b 100644
--- a/mapstructure_bugs_test.go
+++ b/mapstructure_bugs_test.go
@@ -5,17 +5,21 @@
 // GH-1
 func TestDecode_NilValue(t *testing.T) {
 	input := map[string]interface{}{
-		"vstring": nil,
+		"vfoo": nil,
+		"vother": nil,
 	}
 
-	var result Basic
+	var result Map
 	err := Decode(input, &result)
 	if err != nil {
 		t.Fatalf("should not error: %s", err)
 	}
 
-	if result.Vstring != "" {
-		t.Fatalf("value should be default: %s", result.Vstring)
+	if result.Vfoo != "" {
+		t.Fatalf("value should be default: %s", result.Vfoo)
+	}
+
+	if result.Vother != nil {
+		t.Fatalf("Vother should be nil: %s", result.Vother)
 	}
 }
-