Commit ce8bb2fa by Nico Weber Committed by Geoff Lang

Improve standards conformance of ANGLE's testing code.

ANGLE's testing code recently got enabled in Chromium's builds. While it builds fine with cl.exe, it isn't quite standards-conformant and doesn't build with clang. Fix this. There were three issues: 1. ANGLE_TYPED_TEST_CASE() is a variadic macro that tries to use __VA_ARGS__ as argument to a variadic template and then pass that template to another macro. However, [cpp.replace] describes that ANGLE_TYPED_TEST_CASE(Test, int, float) should be expanded to TYPED_TEST_CASE(Test, ::testing::Types<int, float>) which should be interpreted as a "call" of TYPED_TEST_CASE with the 3 macro arguments `Test`, `::testing::Types<int`, and `float>`. As a fix, use a typedef for the variadic template and refer to it through the typedef in the macro call. 2. `#version` was used on its own line in a substitution of the SHADER_SOURCE macro. [cpp]p1 says that every line starting with a `#` is a preprocessing directive, and [cpp.replace]p11 says "If there are sequences of preprocessing tokens within the list of arguments that would otherwise act as preprocessing directives, the behavior is undefined" (with a footnote that this includes non-directives -- # followed by unknown text). As a fix, merge the `#version` line with the previous line. Now the line doesn't start with `#` and things are fine. 3. Unqualified lookup usually doesn't look into dependent bases. If this is desired, one usually has to make the call qualified, a good explanation for this is at http://eli.thegreenplace.net/2012/02/06/dependent-name-lookup-for-c-templates cl.exe doesn't implement this rule, and clang tries to emulate cl.exe's behavior to a certain extend when in Microsoft mode. However, that seems to not work for member templates with explicit types (filed http://llvm.org/PR22066 for this, but since it's not needed to parse Microsoft headers and not standards-conformant, I'm not sure if we'll fix that). As a fix, don't provide an explicit type, the inferred type is the same. This is also consistent with all the other tests in this file. (We might clean up -Wmicrosoft warnings in the future; if so I'll add the explicit this->s that are missing in this file when we do.) BUG=chromium:445406 Change-Id: I77a2f3ab9601a1f0f39b56ed3d05217f123155b8 Reviewed-on: https://chromium-review.googlesource.com/238090Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarBrandon Jones <bajones@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 5b072780
...@@ -208,7 +208,7 @@ TYPED_TEST(SwizzleTest, RG8_2D) ...@@ -208,7 +208,7 @@ TYPED_TEST(SwizzleTest, RG8_2D)
TYPED_TEST(SwizzleTest, R8_2D) TYPED_TEST(SwizzleTest, R8_2D)
{ {
GLubyte data[] = { 2 }; GLubyte data[] = { 2 };
init2DTexture<GLubyte>(GL_R8, GL_RED, GL_UNSIGNED_BYTE, data); init2DTexture(GL_R8, GL_RED, GL_UNSIGNED_BYTE, data);
runTest2D(); runTest2D();
} }
......
...@@ -128,8 +128,7 @@ class TextureTestES3 : public TextureTest<T> ...@@ -128,8 +128,7 @@ class TextureTestES3 : public TextureTest<T>
ASSERT_GL_NO_ERROR(); ASSERT_GL_NO_ERROR();
const std::string vertexShaderSource = SHADER_SOURCE const std::string vertexShaderSource = SHADER_SOURCE
( ( #version 300 es\n
#version 300 es\n
precision highp float; precision highp float;
in vec4 position; in vec4 position;
out vec2 texcoord; out vec2 texcoord;
...@@ -144,8 +143,7 @@ class TextureTestES3 : public TextureTest<T> ...@@ -144,8 +143,7 @@ class TextureTestES3 : public TextureTest<T>
); );
const std::string fragmentShaderSourceArray = SHADER_SOURCE const std::string fragmentShaderSourceArray = SHADER_SOURCE
( ( #version 300 es\n
#version 300 es\n
precision highp float; precision highp float;
uniform sampler2DArray tex; uniform sampler2DArray tex;
uniform int slice; uniform int slice;
......
...@@ -81,6 +81,8 @@ typedef TestFixture<3, D3D11_FL11_0_WARP> ES3_D3D11_FL11_0_WARP; ...@@ -81,6 +81,8 @@ typedef TestFixture<3, D3D11_FL11_0_WARP> ES3_D3D11_FL11_0_WARP;
typedef TestFixture<3, D3D11_FL10_1_WARP> ES3_D3D11_FL10_1_WARP; typedef TestFixture<3, D3D11_FL10_1_WARP> ES3_D3D11_FL10_1_WARP;
typedef TestFixture<3, D3D11_FL10_0_WARP> ES3_D3D11_FL10_0_WARP; typedef TestFixture<3, D3D11_FL10_0_WARP> ES3_D3D11_FL10_0_WARP;
#define ANGLE_TYPED_TEST_CASE(testName, ...) TYPED_TEST_CASE(testName, ::testing::Types<__VA_ARGS__>); #define ANGLE_TYPED_TEST_CASE(testName, ...) \
typedef ::testing::Types<__VA_ARGS__> Helper##testName; \
TYPED_TEST_CASE(testName, Helper##testName);
#endif // UTIL_TEST_FIXTURE_TYPES_H #endif // UTIL_TEST_FIXTURE_TYPES_H
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment