Merge changes from topic "b117561179"

* changes:
  More verbose error for safe_union invalid access.
  safe_union: return error on bad reads
diff --git a/CompoundType.cpp b/CompoundType.cpp
index dd0ea26..6f75d7c 100644
--- a/CompoundType.cpp
+++ b/CompoundType.cpp
@@ -210,9 +210,14 @@
     return false;
 }
 
-void CompoundType::emitSafeUnionUnknownDiscriminatorError(Formatter& out,
-                                                          const std::string& value) const {
-    out << "::android::hardware::details::logAlwaysFatal((\n";
+void CompoundType::emitSafeUnionUnknownDiscriminatorError(Formatter& out, const std::string& value,
+                                                          bool fatal) const {
+    if (fatal) {
+        out << "::android::hardware::details::logAlwaysFatal(";
+    } else {
+        out << "ALOGE(\"%s\", ";
+    }
+    out << "(\n";
     out.indent(2, [&] {
         out << "\"Unknown union discriminator (value: \" +\n"
             << "std::to_string(" << getUnionDiscriminatorType()->getCppTypeCast(value)
@@ -294,7 +299,14 @@
             }
 
             out << "default: ";
-            out.block([&] { emitSafeUnionUnknownDiscriminatorError(out, "_hidl_d_primitive"); })
+            out.block([&] {
+                   emitSafeUnionUnknownDiscriminatorError(out, "_hidl_d_primitive",
+                                                          !isReader /*fatal*/);
+                   if (isReader) {
+                       out << "_hidl_err = BAD_VALUE;\n";
+                       handleError(out, mode);
+                   }
+               })
                 .endl();
         }).endl();
     }).endl();
@@ -857,7 +869,10 @@
 
         if (mStyle == STYLE_SAFE_UNION) {
             out << "default: ";
-            out.block([&] { emitSafeUnionUnknownDiscriminatorError(out, "o.getDiscriminator()"); })
+            out.block([&] {
+                   emitSafeUnionUnknownDiscriminatorError(out, "o.getDiscriminator()",
+                                                          true /*fatal*/);
+               })
                 .endl();
 
             out.unindent();
@@ -905,7 +920,8 @@
             if (mStyle == STYLE_SAFE_UNION) {
                 out << "default: ";
                 out.block([&] {
-                       emitSafeUnionUnknownDiscriminatorError(out, "lhs.getDiscriminator()");
+                       emitSafeUnionUnknownDiscriminatorError(out, "lhs.getDiscriminator()",
+                                                              true /*fatal*/);
                    })
                     .endl();
 
@@ -1023,7 +1039,12 @@
             << ")) ";
 
         out.block([&] {
-            out << "::android::hardware::details::logAlwaysFatal(\"Bad safe_union access.\");\n";
+            out << "LOG_ALWAYS_FATAL(\"Bad safe_union access: safe_union has discriminator %\" "
+                << "PRIu64 \" but discriminator %\" PRIu64 \" was accessed.\",\n";
+            out.indent(2, [&] {
+                out << "static_cast<uint64_t>(hidl_d), "
+                    << "static_cast<uint64_t>(hidl_discriminator::" << fieldName << "));";
+            }).endl();
         }).endl().endl();
 
         out << "return hidl_u."
@@ -1092,8 +1113,10 @@
             }
 
             out << "default: ";
-            out.block(
-                   [&] { emitSafeUnionUnknownDiscriminatorError(out, parameterName + ".hidl_d"); })
+            out.block([&] {
+                   emitSafeUnionUnknownDiscriminatorError(out, parameterName + ".hidl_d",
+                                                          true /*fatal*/);
+               })
                 .endl();
         }).endl();
 
@@ -1215,7 +1238,9 @@
             }
 
             out << "default: ";
-            out.block([&] { emitSafeUnionUnknownDiscriminatorError(out, "hidl_d"); }).endl();
+            out.block(
+                   [&] { emitSafeUnionUnknownDiscriminatorError(out, "hidl_d", true /*fatal*/); })
+                .endl();
         }).endl().endl();
     }).endl().endl();
 
@@ -1297,9 +1322,16 @@
     }
 }
 
-static void emitJavaSafeUnionUnknownDiscriminatorError(Formatter& out) {
-    out << "throw new Error(\"Unknown union discriminator "
-        << "(value: \" + hidl_d + \").\");\n";
+static void emitJavaSafeUnionUnknownDiscriminatorError(Formatter& out, bool fatal) {
+    out << "throw new ";
+
+    if (fatal) {
+        out << "Error";
+    } else {
+        out << "IllegalStateException";
+    }
+
+    out << "(\"Unknown union discriminator (value: \" + hidl_d + \").\");\n";
 }
 
 void CompoundType::emitJavaTypeDeclarations(Formatter& out, bool atTopLevel) const {
@@ -1543,7 +1575,8 @@
 
         if (mStyle == STYLE_SAFE_UNION) {
             out << "default: ";
-            out.block([&] { emitJavaSafeUnionUnknownDiscriminatorError(out); }).endl();
+            out.block([&] { emitJavaSafeUnionUnknownDiscriminatorError(out, true /*fatal*/); })
+                .endl();
 
             out.unindent();
             out << "}\n";
@@ -1589,7 +1622,8 @@
 
         if (mStyle == STYLE_SAFE_UNION) {
             out << "default: ";
-            out.block([&] { emitJavaSafeUnionUnknownDiscriminatorError(out); }).endl();
+            out.block([&] { emitJavaSafeUnionUnknownDiscriminatorError(out, false /*fatal*/); })
+                .endl();
 
             out.unindent();
             out << "}\n";
@@ -1682,7 +1716,8 @@
 
         if (mStyle == STYLE_SAFE_UNION) {
             out << "default: ";
-            out.block([&] { emitJavaSafeUnionUnknownDiscriminatorError(out); }).endl();
+            out.block([&] { emitJavaSafeUnionUnknownDiscriminatorError(out, false /*fatal*/); })
+                .endl();
 
             out.unindent();
             out << "}\n";
@@ -1722,7 +1757,8 @@
 
         if (mStyle == STYLE_SAFE_UNION) {
             out << "default: ";
-            out.block([&] { emitJavaSafeUnionUnknownDiscriminatorError(out); }).endl();
+            out.block([&] { emitJavaSafeUnionUnknownDiscriminatorError(out, true /*fatal*/); })
+                .endl();
 
             out.unindent();
             out << "}\n";
@@ -1811,7 +1847,8 @@
 
         if (mStyle == STYLE_SAFE_UNION) {
             out << "default: ";
-            out.block([&] { emitJavaSafeUnionUnknownDiscriminatorError(out); }).endl();
+            out.block([&] { emitJavaSafeUnionUnknownDiscriminatorError(out, true /*fatal*/); })
+                .endl();
 
             out.unindent();
             out << "}\n";
diff --git a/CompoundType.h b/CompoundType.h
index 75b93db..e02090a 100644
--- a/CompoundType.h
+++ b/CompoundType.h
@@ -176,7 +176,8 @@
     void emitSafeUnionTypeDeclarations(Formatter& out) const;
     std::unique_ptr<ScalarType> getUnionDiscriminatorType() const;
 
-    void emitSafeUnionUnknownDiscriminatorError(Formatter& out, const std::string& value) const;
+    void emitSafeUnionUnknownDiscriminatorError(Formatter& out, const std::string& value,
+                                                bool fatal) const;
 
     void emitSafeUnionCopyAndAssignDefinition(Formatter& out,
                                               const std::string& parameterName,
diff --git a/generateCpp.cpp b/generateCpp.cpp
index fb930c3..130a0b9 100644
--- a/generateCpp.cpp
+++ b/generateCpp.cpp
@@ -794,7 +794,7 @@
         << mPackage.string() << "::" << baseName
         << "\"\n\n";
 
-    out << "#include <android/log.h>\n";
+    out << "#include <log/log.h>\n";
     out << "#include <cutils/trace.h>\n";
     out << "#include <hidl/HidlTransportSupport.h>\n\n";
     out << "#include <hidl/Static.h>\n";