rust: Add cflag checks against -xc++ and -std.

If -x c++ is passed through a modules cflags, it will be overridden by a
-x c and -std flag added by the build system if the extension is not
.hpp/.hh and cpp_std is not set. This leads to confusing behavior.

Instead, add a helpful error message to guide developers towards the
correct way to specify when a header is  a C++ header and which std
version should be used.

Bug: 171011490
Test: m nothing
Change-Id: I7e7cba504798d47ce1c753ba8699d7475a95095b
diff --git a/rust/bindgen.go b/rust/bindgen.go
index ac33ff7..46d4acb 100644
--- a/rust/bindgen.go
+++ b/rust/bindgen.go
@@ -150,6 +150,18 @@
 
 	esc := proptools.NinjaAndShellEscapeList
 
+	// Filter out invalid cflags
+	for _, flag := range b.ClangProperties.Cflags {
+		if flag == "-x c++" || flag == "-xc++" {
+			ctx.PropertyErrorf("cflags",
+				"-x c++ should not be specified in cflags; setting cpp_std specifies this is a C++ header, or change the file extension to '.hpp' or '.hh'")
+		}
+		if strings.HasPrefix(flag, "-std=") {
+			ctx.PropertyErrorf("cflags",
+				"-std should not be specified in cflags; instead use c_std or cpp_std")
+		}
+	}
+
 	// Module defined clang flags and include paths
 	cflags = append(cflags, esc(b.ClangProperties.Cflags)...)
 	for _, include := range b.ClangProperties.Local_include_dirs {
diff --git a/rust/bindgen_test.go b/rust/bindgen_test.go
index 9cccf13..c7ce42b 100644
--- a/rust/bindgen_test.go
+++ b/rust/bindgen_test.go
@@ -134,3 +134,29 @@
 		t.Errorf("cpp_std value not passed in to rust_bindgen as a clang flag")
 	}
 }
+
+func TestBindgenDisallowedFlags(t *testing.T) {
+	// Make sure passing '-x c++' to cflags generates an error
+	testRustError(t, "cflags: -x c\\+\\+ should not be specified in cflags.*", `
+		rust_bindgen {
+			name: "libbad_flag",
+			wrapper_src: "src/any.h",
+			crate_name: "bindgen",
+			stem: "libbindgen",
+			source_stem: "bindings",
+			cflags: ["-x c++"]
+		}
+	`)
+
+	// Make sure passing '-std=' to cflags generates an error
+	testRustError(t, "cflags: -std should not be specified in cflags.*", `
+		rust_bindgen {
+			name: "libbad_flag",
+			wrapper_src: "src/any.h",
+			crate_name: "bindgen",
+			stem: "libbindgen",
+			source_stem: "bindings",
+			cflags: ["-std=foo"]
+		}
+	`)
+}