Fix NULL/False to std::string conversion errors

Newer versions of GCC reject std::string(DE_NULL). Previously this
didn't cause any errors or warnings when compiling, but should produce
an error at runtime. This change replaces invalid values with empty
string literals and adds deFatalStr for cases that potentially
relied on the string constructor throwing an exception.

Components: Framework, OpenGL, Vulkan
VK-GL-CTS issue: 3419

Change-Id: I68ec7d1447d1e96f5d7841e0684687cdd294fe39
diff --git a/external/vulkancts/modules/vulkan/image/vktImageAtomicOperationTests.cpp b/external/vulkancts/modules/vulkan/image/vktImageAtomicOperationTests.cpp
index a6e624b..2159975 100644
--- a/external/vulkancts/modules/vulkan/image/vktImageAtomicOperationTests.cpp
+++ b/external/vulkancts/modules/vulkan/image/vktImageAtomicOperationTests.cpp
@@ -115,7 +115,7 @@
 			return string("ivec3(" + x + "," + y + "," + z + ")");
 		default:
 			DE_ASSERT(false);
-			return DE_NULL;
+			return "";
 	}
 }
 
@@ -142,7 +142,7 @@
 			return string("((" + z + "*" + toString(gridSize.x()) + " + " + x + ")*" + toString(gridSize.y()) + " + " + y + ")");
 		default:
 			DE_ASSERT(false);
-			return DE_NULL;
+			return "";
 	}
 }
 
@@ -163,7 +163,7 @@
 		case ATOMIC_OPERATION_COMPARE_EXCHANGE:	return string("compare_exchange");
 		default:
 			DE_ASSERT(false);
-			return DE_NULL;
+			return "";
 	}
 }
 
@@ -181,7 +181,7 @@
 		case ATOMIC_OPERATION_COMPARE_EXCHANGE:	return string("imageAtomicCompSwap");
 		default:
 			DE_ASSERT(false);
-			return DE_NULL;
+			return "";
 	}
 }
 
diff --git a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationOperation.cpp b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationOperation.cpp
index aebfbce..16c581c 100644
--- a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationOperation.cpp
+++ b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationOperation.cpp
@@ -413,7 +413,7 @@
 
 		default:
 			DE_FATAL("Unknown image type");
-			return DE_NULL;
+			return "";
 	}
 }
 
diff --git a/external/vulkancts/modules/vulkan/tessellation/vktTessellationUserDefinedIO.cpp b/external/vulkancts/modules/vulkan/tessellation/vktTessellationUserDefinedIO.cpp
index 106ee04..19cddc7 100644
--- a/external/vulkancts/modules/vulkan/tessellation/vktTessellationUserDefinedIO.cpp
+++ b/external/vulkancts/modules/vulkan/tessellation/vktTessellationUserDefinedIO.cpp
@@ -148,7 +148,7 @@
 	else
 	{
 		DE_ASSERT(false);
-		return DE_NULL;
+		return "";
 	}
 }
 
@@ -311,7 +311,7 @@
 		++currentIndex;
 	}
 	DE_ASSERT(false);
-	return DE_NULL;
+	return "";
 }
 
 class IOBlock : public TopLevelObject
@@ -428,7 +428,7 @@
 		}
 	}
 	DE_ASSERT(false);
-	return DE_NULL;
+	return "";
 }
 
 class UserDefinedIOTest : public TestCase
@@ -464,7 +464,7 @@
 	const std::string	vertexAttrArrayInputSize	= m_caseDef.vertexIOArraySize == VERTEX_IO_ARRAY_SIZE_IMPLICIT					? ""
 													: m_caseDef.vertexIOArraySize == VERTEX_IO_ARRAY_SIZE_EXPLICIT_SHADER_BUILTIN	? "gl_MaxPatchVertices"
 													: m_caseDef.vertexIOArraySize == VERTEX_IO_ARRAY_SIZE_EXPLICIT_SPEC_MIN			? de::toString(MAX_TESSELLATION_PATCH_SIZE)
-													: DE_NULL;
+													: deFatalStr("Invalid vertexIOArraySize");
 
 	const char* const	maybePatch					= isPerPatchIO ? "patch " : "";
 	const std::string	outMaybePatch				= std::string() + maybePatch + "out ";
diff --git a/framework/delibs/debase/deDefs.h b/framework/delibs/debase/deDefs.h
index 314d2ad..ed3b917 100644
--- a/framework/delibs/debase/deDefs.h
+++ b/framework/delibs/debase/deDefs.h
@@ -382,6 +382,8 @@
 #	define DE_UNUSED_FUNCTION
 #endif
 
+DE_INLINE const char* deFatalStr (const char* reason) { DE_ASSERT(0); return reason; }
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/framework/opengl/gluShaderLibrary.cpp b/framework/opengl/gluShaderLibrary.cpp
index 293c919..347ce4c 100644
--- a/framework/opengl/gluShaderLibrary.cpp
+++ b/framework/opengl/gluShaderLibrary.cpp
@@ -1316,7 +1316,7 @@
 				case TOKEN_TESSELLATION_EVALUATION:	program.sources.sources[SHADERTYPE_TESSELLATION_EVALUATION].push_back(source);	break;
 				case TOKEN_GEOMETRY:				program.sources.sources[SHADERTYPE_GEOMETRY].push_back(source);					break;
 				default:
-					parseError(DE_FALSE);
+					DE_FATAL("Unreachable");
 			}
 		}
 		else
@@ -1418,7 +1418,7 @@
 				}
 
 				default:
-					parseError(DE_FALSE);
+					DE_FATAL("Unreachable");
 			}
 		}
 		else if (m_curToken == TOKEN_VERSION)
diff --git a/modules/gles2/performance/es2pShaderOptimizationTests.cpp b/modules/gles2/performance/es2pShaderOptimizationTests.cpp
index 1bef454..ade8061 100644
--- a/modules/gles2/performance/es2pShaderOptimizationTests.cpp
+++ b/modules/gles2/performance/es2pShaderOptimizationTests.cpp
@@ -108,7 +108,7 @@
 		case CASESHADERTYPE_FRAGMENT:	return "mediump";
 		default:
 			DE_ASSERT(false);
-			return DE_NULL;
+			return "";
 	}
 }
 
@@ -336,7 +336,7 @@
 			case CASETYPE_DEPENDENT:	return "value = sin(value)";
 			default:
 				DE_ASSERT(false);
-				return DE_NULL;
+				return "";
 		}
 	}
 
@@ -451,7 +451,7 @@
 		const string	statements		= m_caseType == CASETYPE_BUILT_IN_FUNCTIONS		? builtinFunctionsCaseStatements	(optimized, m_useConstantExpressionsOnly, precision, isVertexCase)
 										: m_caseType == CASETYPE_ARRAY					? arrayCaseStatements				(optimized, precision, isVertexCase)
 										: m_caseType == CASETYPE_STRUCT					? structCaseStatements				(optimized, m_useConstantExpressionsOnly, precision, isVertexCase)
-										: DE_NULL;
+										: deFatalStr("Invalid CaseType");
 
 		return defaultProgramData(m_caseShaderType, statements);
 	}
@@ -552,7 +552,7 @@
 										: m_caseType == CASETYPE_MULTIPLE_STATEMENTS	? multipleStatementsCaseStatements	(optimized, precision, isVertexCase)
 										: m_caseType == CASETYPE_STATIC_BRANCH			? staticBranchCaseStatements		(optimized, precision, isVertexCase)
 										: m_caseType == CASETYPE_LOOP					? loopCaseStatements				(optimized, precision, isVertexCase)
-										: DE_NULL;
+										: deFatalStr("Invalid CaseType");
 
 		return defaultProgramData(m_caseShaderType, statements);
 	}
@@ -702,7 +702,7 @@
 										: m_caseType == CASETYPE_UNUSED_VALUE_DEAD_BRANCH		? unusedValueDeadBranchCaseStatements		(optimized, precision, isVertexCase)
 										: m_caseType == CASETYPE_UNUSED_VALUE_AFTER_RETURN		? unusedValueAfterReturnCaseStatements		()
 										: m_caseType == CASETYPE_UNUSED_VALUE_MUL_ZERO			? unusedValueMulZeroCaseStatements			(optimized, precision, isVertexCase)
-										: DE_NULL;
+										: deFatalStr("Invalid CaseType");
 
 		return defaultProgramData(m_caseShaderType, funcDefs, statements);
 	}
diff --git a/modules/gles3/performance/es3pShaderOptimizationTests.cpp b/modules/gles3/performance/es3pShaderOptimizationTests.cpp
index 8c63efa..80adce8 100644
--- a/modules/gles3/performance/es3pShaderOptimizationTests.cpp
+++ b/modules/gles3/performance/es3pShaderOptimizationTests.cpp
@@ -108,7 +108,7 @@
 		case CASESHADERTYPE_FRAGMENT:	return "highp";
 		default:
 			DE_ASSERT(false);
-			return DE_NULL;
+			return "";
 	}
 }
 
@@ -339,7 +339,7 @@
 			case CASETYPE_DEPENDENT:	return "value = sin(value)";
 			default:
 				DE_ASSERT(false);
-				return DE_NULL;
+				return "";
 		}
 	}
 
@@ -453,7 +453,7 @@
 		const string	statements		= m_caseType == CASETYPE_BUILT_IN_FUNCTIONS		? builtinFunctionsCaseStatements	(optimized, m_useConstantExpressionsOnly, precision, isVertexCase)
 										: m_caseType == CASETYPE_ARRAY					? arrayCaseStatements				(optimized, m_useConstantExpressionsOnly, precision, isVertexCase)
 										: m_caseType == CASETYPE_STRUCT					? structCaseStatements				(optimized, m_useConstantExpressionsOnly, precision, isVertexCase)
-										: DE_NULL;
+										: deFatalStr("Invalid CaseType");
 
 		return defaultProgramData(m_caseShaderType, statements);
 	}
@@ -563,7 +563,7 @@
 										: m_caseType == CASETYPE_MULTIPLE_STATEMENTS	? multipleStatementsCaseStatements	(optimized, precision, isVertexCase)
 										: m_caseType == CASETYPE_STATIC_BRANCH			? staticBranchCaseStatements		(optimized, precision, isVertexCase)
 										: m_caseType == CASETYPE_LOOP					? loopCaseStatements				(optimized, precision, isVertexCase)
-										: DE_NULL;
+										: deFatalStr("Invalid CaseType");
 
 		return defaultProgramData(m_caseShaderType, statements);
 	}
@@ -713,7 +713,7 @@
 										: m_caseType == CASETYPE_UNUSED_VALUE_DEAD_BRANCH		? unusedValueDeadBranchCaseStatements		(optimized, precision, isVertexCase)
 										: m_caseType == CASETYPE_UNUSED_VALUE_AFTER_RETURN		? unusedValueAfterReturnCaseStatements		()
 										: m_caseType == CASETYPE_UNUSED_VALUE_MUL_ZERO			? unusedValueMulZeroCaseStatements			(optimized, precision, isVertexCase)
-										: DE_NULL;
+										: deFatalStr("Invalid CaseType");
 
 		return defaultProgramData(m_caseShaderType, funcDefs, statements);
 	}
diff --git a/modules/gles31/functional/es31fGeometryShaderTests.cpp b/modules/gles31/functional/es31fGeometryShaderTests.cpp
index 7fa9c6a..7ceba8b 100644
--- a/modules/gles31/functional/es31fGeometryShaderTests.cpp
+++ b/modules/gles31/functional/es31fGeometryShaderTests.cpp
@@ -1181,7 +1181,7 @@
 	else
 	{
 		DE_ASSERT(DE_FALSE);
-		return DE_NULL;
+		return "";
 	}
 }
 
diff --git a/modules/gles31/functional/es31fNegativeAdvancedBlendEquationTests.cpp b/modules/gles31/functional/es31fNegativeAdvancedBlendEquationTests.cpp
index 511bb5c..2d28dba 100644
--- a/modules/gles31/functional/es31fNegativeAdvancedBlendEquationTests.cpp
+++ b/modules/gles31/functional/es31fNegativeAdvancedBlendEquationTests.cpp
@@ -101,7 +101,7 @@
 		default:
 			DE_FATAL("Equation not supported.");
 	}
-	return DE_NULL;
+	return "";
 }
 
 glw::GLenum getEquation (BlendEquation equation)
diff --git a/modules/gles31/functional/es31fProgramInterfaceQueryTests.cpp b/modules/gles31/functional/es31fProgramInterfaceQueryTests.cpp
index d8578b2..0c8e336 100644
--- a/modules/gles31/functional/es31fProgramInterfaceQueryTests.cpp
+++ b/modules/gles31/functional/es31fProgramInterfaceQueryTests.cpp
@@ -1414,7 +1414,7 @@
 	}
 
 	DE_ASSERT(false);
-	return DE_NULL;
+	return "";
 }
 
 class ResourceNameBufferLimitCase : public TestCase
diff --git a/modules/gles31/functional/es31fShaderImageLoadStoreTests.cpp b/modules/gles31/functional/es31fShaderImageLoadStoreTests.cpp
index 0e51ab8..d27ed76 100644
--- a/modules/gles31/functional/es31fShaderImageLoadStoreTests.cpp
+++ b/modules/gles31/functional/es31fShaderImageLoadStoreTests.cpp
@@ -1197,7 +1197,7 @@
 															"	imageStore(u_image, ivec2(gx, gy), " + colorExpr + ");\n"
 														 : shaderImageType == TEXTURETYPE_3D || shaderImageType == TEXTURETYPE_CUBE || shaderImageType == TEXTURETYPE_2D_ARRAY ?
 															"	imageStore(u_image, ivec3(gx, gy, gz), " + colorExpr + ");\n"
-														 : DE_NULL) +
+														 : deFatalStr("Invalid TextureType")) +
 														"}\n"));
 
 		UniformAccessLogger uniforms(renderCtx.getFunctions(), log, program.getProgram());
@@ -1448,7 +1448,7 @@
 														 : shaderImageType == TEXTURETYPE_3D || shaderImageType == TEXTURETYPE_CUBE || shaderImageType == TEXTURETYPE_2D_ARRAY ?
 															"	ivec3 pos = ivec3(gl_GlobalInvocationID);\n"
 															"	imageStore(u_image1, pos, imageLoad(u_image0, ivec3(" + toString(imageSize.x()-1) + "-pos.x, pos.y, pos.z)));\n"
-														 : DE_NULL) +
+														 : deFatalStr("Invalid TextureType")) +
 														"}\n"));
 
 		UniformAccessLogger uniforms(renderCtx.getFunctions(), log, program.getProgram());
@@ -1691,7 +1691,7 @@
 
 		default:
 			DE_ASSERT(false);
-			return DE_NULL;
+			return "";
 	}
 }
 
@@ -2043,7 +2043,7 @@
 															"	imageStore(u_returnValues, " + invocationCoord + ", " + colorVecTypeName + "(" + atomicInvocation + "));\n"
 														 : m_caseType == ATOMIC_OPERATION_CASE_TYPE_END_RESULT ?
 															"	" + atomicInvocation + ";\n"
-														 : DE_NULL) +
+														 : deFatalStr("Invalid AtomicOperationCaseType")) +
 														"}\n"));
 
 		UniformAccessLogger uniforms(renderCtx.getFunctions(), log, program.getProgram());
@@ -3304,7 +3304,7 @@
 					const char* const					imageAccessStr	= imageAccess == ImageSizeCase::IMAGEACCESS_READ_ONLY				? "readonly"
 																		: imageAccess == ImageSizeCase::IMAGEACCESS_WRITE_ONLY				? "writeonly"
 																		: imageAccess == ImageSizeCase::IMAGEACCESS_READ_ONLY_WRITE_ONLY	? "readonly_writeonly"
-																		: DE_NULL;
+																		: deFatalStr("Invalid ImageAccess");
 
 					for (int imageSizeNdx = 0; imageSizeNdx < DE_LENGTH_OF_ARRAY(baseImageSizes); imageSizeNdx++)
 					{
@@ -3321,7 +3321,7 @@
 													: imageType == TEXTURETYPE_CUBE			? toString(imageSize.x()) + "x" + toString(imageSize.y())
 													: imageType == TEXTURETYPE_3D			? toString(imageSize.x()) + "x" + toString(imageSize.y()) + "x" + toString(imageSize.z())
 													: imageType == TEXTURETYPE_2D_ARRAY		? toString(imageSize.x()) + "x" + toString(imageSize.y()) + "x" + toString(imageSize.z())
-													: DE_NULL;
+													: deFatalStr("Invalid TextureType");
 
 						const string	caseName	= string() + imageAccessStr + "_" + sizeStr;
 
diff --git a/modules/gles31/functional/es31fTessellationTests.cpp b/modules/gles31/functional/es31fTessellationTests.cpp
index c5bbf96..69ce613 100644
--- a/modules/gles31/functional/es31fTessellationTests.cpp
+++ b/modules/gles31/functional/es31fTessellationTests.cpp
@@ -1640,7 +1640,7 @@
 														"	gl_TessLevelOuter[1] = 1.0 + 59.0 * 0.5 * (in_tc_tessParam[1] + in_tc_tessParam[0]);\n"
 														"	gl_TessLevelOuter[2] = 1.0 + 59.0 * 0.5 * (in_tc_tessParam[3] + in_tc_tessParam[1]);\n"
 														"	gl_TessLevelOuter[3] = 1.0 + 59.0 * 0.5 * (in_tc_tessParam[2] + in_tc_tessParam[3]);\n"
-													  : DE_NULL) +
+													  : deFatalStr("Invalid TessPrimitiveType")) +
 												 "}\n");
 
 	std::string tessellationEvaluationTemplate	("${GLSL_VERSION_DECL}\n"
@@ -1674,11 +1674,11 @@
 															"	highp vec2 c = (1.0-gl_TessCoord.x)*(    gl_TessCoord.y)*in_te_position[2];\n"
 															"	highp vec2 d = (    gl_TessCoord.x)*(    gl_TessCoord.y)*in_te_position[3];\n"
 															"	highp vec2 pos = a+b+c+d;\n"
-														 : DE_NULL) +
+														 : deFatalStr("Invalid CaseType")) +
 														"\n"
 														"	highp float f = sqrt(1.0 - 2.0 * max(abs(gl_TessCoord.x - 0.5), abs(gl_TessCoord.y - 0.5)))*0.5 + 0.5;\n"
 														"	in_f_color = vec4(0.1, gl_TessCoord.xy*f, 1.0);\n"
-													  : DE_NULL) +
+													  : deFatalStr("Invalid TessPrimitiveType")) +
 													 "\n"
 													 "	// Offset the position slightly, based on the parity of the bits in the float representation.\n"
 													 "	// This is done to detect possible small differences in edge vertex positions between patches.\n"
@@ -5742,7 +5742,7 @@
 	else
 	{
 		DE_ASSERT(false);
-		return DE_NULL;
+		return "";
 	}
 }
 
@@ -5861,7 +5861,7 @@
 		currentIndex++;
 	}
 	DE_ASSERT(false);
-	return DE_NULL;
+	return "";
 }
 
 string UserDefinedIOCase::IOBlock::basicSubobjectAtIndex (int subobjectIndex, int arraySize) const
@@ -5883,7 +5883,7 @@
 		}
 	}
 	DE_ASSERT(false);
-	return DE_NULL;
+	return "";
 }
 
 // Used as the 'visit' argument for glslTraverseBasicTypes.
@@ -5969,7 +5969,7 @@
 	const string		vertexAttrArrayInputSize	= m_vertexIOArraySize == VERTEX_IO_ARRAY_SIZE_IMPLICIT					? ""
 													: m_vertexIOArraySize == VERTEX_IO_ARRAY_SIZE_EXPLICIT_SHADER_BUILTIN	? "gl_MaxPatchVertices"
 													: m_vertexIOArraySize == VERTEX_IO_ARRAY_SIZE_EXPLICIT_QUERY			? de::toString(m_context.getContextInfo().getInt(GL_MAX_PATCH_VERTICES))
-													: DE_NULL;
+													: deFatalStr("Invalid VertexIOArraySize");
 
 	const char* const	maybePatch					= isPerPatchIO ? "patch " : "";
 	const string		outMaybePatch				= string() + maybePatch + "out ";