Test a couple error cases
diff --git a/mapstructure.go b/mapstructure.go
index eaf505d..d4a49ed 100644
--- a/mapstructure.go
+++ b/mapstructure.go
@@ -9,7 +9,12 @@
 // MapToStruct takes a map and uses reflection to convert it into the
 // given Go native structure. val must be a pointer to a struct.
 func MapToStruct(m map[string]interface{}, rawVal interface{}) error {
-	val := reflect.ValueOf(rawVal).Elem()
+	val := reflect.ValueOf(rawVal)
+	if val.Kind() != reflect.Ptr {
+		return errors.New("val must be a pointer")
+	}
+
+	val = val.Elem()
 	if !val.CanAddr() {
 		return errors.New("val must be addressable (a pointer)")
 	}
diff --git a/mapstructure_test.go b/mapstructure_test.go
index 593ba06..ec47e70 100644
--- a/mapstructure_test.go
+++ b/mapstructure_test.go
@@ -36,3 +36,32 @@
 		t.Errorf("vbool value should be true: %#v", result.Vbool)
 	}
 }
+
+func TestNonPtrValue(t *testing.T) {
+	t.Parallel()
+
+	err := MapToStruct(map[string]interface{}{}, Basic{})
+	if err == nil {
+		t.Error("error should exist")
+		t.FailNow()
+	}
+
+	if err.Error() != "val must be a pointer" {
+		t.Errorf("got unexpected error: %s", err)
+	}
+}
+
+func TestNontStructValue(t *testing.T) {
+	t.Parallel()
+
+	result := 42
+	err := MapToStruct(map[string]interface{}{}, &result)
+	if err == nil {
+		t.Error("error should exist")
+		t.FailNow()
+	}
+
+	if err.Error() != "val must be an addressable struct" {
+		t.Errorf("got unexpected error: %s", err)
+	}
+}