1af69d88dSmrg/* 2af69d88dSmrg * Copyright © 2013 Intel Corporation 3af69d88dSmrg * 4af69d88dSmrg * Permission is hereby granted, free of charge, to any person obtaining a 5af69d88dSmrg * copy of this software and associated documentation files (the "Software"), 6af69d88dSmrg * to deal in the Software without restriction, including without limitation 7af69d88dSmrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8af69d88dSmrg * and/or sell copies of the Software, and to permit persons to whom the 9af69d88dSmrg * Software is furnished to do so, subject to the following conditions: 10af69d88dSmrg * 11af69d88dSmrg * The above copyright notice and this permission notice (including the next 12af69d88dSmrg * paragraph) shall be included in all copies or substantial portions of the 13af69d88dSmrg * Software. 14af69d88dSmrg * 15af69d88dSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16af69d88dSmrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17af69d88dSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18af69d88dSmrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19af69d88dSmrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20af69d88dSmrg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21af69d88dSmrg * DEALINGS IN THE SOFTWARE. 22af69d88dSmrg */ 23af69d88dSmrg#include <gtest/gtest.h> 24af69d88dSmrg#include <signal.h> 25af69d88dSmrg#include <setjmp.h> 26af69d88dSmrg 27af69d88dSmrg#include "glxclient.h" 28af69d88dSmrg#include "glx_error.h" 29af69d88dSmrg 30af69d88dSmrgextern bool GetGLXScreenConfigs_called; 31af69d88dSmrgextern struct glx_screen *psc; 32af69d88dSmrg 33af69d88dSmrgstruct attribute_test_vector { 34af69d88dSmrg const char *string; 35af69d88dSmrg int value; 36af69d88dSmrg}; 37af69d88dSmrg 38af69d88dSmrg#define E(x) { # x, x } 39af69d88dSmrg 40af69d88dSmrg 41af69d88dSmrg 42af69d88dSmrgstatic bool got_sigsegv; 43af69d88dSmrgstatic jmp_buf jmp; 44af69d88dSmrg 45af69d88dSmrgstatic void 46af69d88dSmrgsigsegv_handler(int sig) 47af69d88dSmrg{ 48af69d88dSmrg (void) sig; 49af69d88dSmrg got_sigsegv = true; 50af69d88dSmrg longjmp(jmp, 1); 51af69d88dSmrg} 52af69d88dSmrg 53af69d88dSmrgstatic bool query_renderer_string_called = false; 54af69d88dSmrgstatic bool query_renderer_integer_called = false; 55af69d88dSmrg 56af69d88dSmrgstatic int 57af69d88dSmrgfake_query_renderer_integer(struct glx_screen *psc, int attribute, 58af69d88dSmrg unsigned int *value) 59af69d88dSmrg{ 60af69d88dSmrg (void) psc; 61af69d88dSmrg (void) attribute; 62af69d88dSmrg (void) value; 63af69d88dSmrg 64af69d88dSmrg query_renderer_integer_called = true; 65af69d88dSmrg 66af69d88dSmrg return -1; 67af69d88dSmrg} 68af69d88dSmrg 69af69d88dSmrgstatic int 70af69d88dSmrgfake_query_renderer_string(struct glx_screen *psc, int attribute, 71af69d88dSmrg const char **value) 72af69d88dSmrg{ 73af69d88dSmrg (void) psc; 74af69d88dSmrg (void) attribute; 75af69d88dSmrg (void) value; 76af69d88dSmrg 77af69d88dSmrg query_renderer_string_called = true; 78af69d88dSmrg 79af69d88dSmrg return -1; 80af69d88dSmrg} 81af69d88dSmrg 82af69d88dSmrgstruct glx_screen_vtable fake_vtable = { 83af69d88dSmrg NULL, 84af69d88dSmrg NULL, 85af69d88dSmrg fake_query_renderer_integer, 86af69d88dSmrg fake_query_renderer_string 87af69d88dSmrg}; 88af69d88dSmrg 89af69d88dSmrgclass query_renderer_string_test : public ::testing::Test { 90af69d88dSmrgpublic: 91af69d88dSmrg virtual void SetUp(); 92af69d88dSmrg virtual void TearDown(); 93af69d88dSmrg 94af69d88dSmrg struct glx_screen scr; 95af69d88dSmrg struct sigaction sa; 96af69d88dSmrg struct sigaction old_sa; 97af69d88dSmrg Display dpy; 98af69d88dSmrg}; 99af69d88dSmrg 100af69d88dSmrgclass query_renderer_integer_test : public query_renderer_string_test { 101af69d88dSmrg}; 102af69d88dSmrg 103af69d88dSmrgvoid query_renderer_string_test::SetUp() 104af69d88dSmrg{ 105af69d88dSmrg memset(&scr, 0, sizeof(scr)); 106af69d88dSmrg scr.vtable = &fake_vtable; 107af69d88dSmrg psc = &scr; 108af69d88dSmrg 109af69d88dSmrg got_sigsegv = false; 110af69d88dSmrg 111af69d88dSmrg sa.sa_handler = sigsegv_handler; 112af69d88dSmrg sigemptyset(&sa.sa_mask); 113af69d88dSmrg sa.sa_flags = 0; 114af69d88dSmrg sigaction(SIGSEGV, &sa, &old_sa); 115af69d88dSmrg} 116af69d88dSmrg 117af69d88dSmrgvoid query_renderer_string_test::TearDown() 118af69d88dSmrg{ 119af69d88dSmrg sigaction(SIGSEGV, &old_sa, NULL); 120af69d88dSmrg} 121af69d88dSmrg 122af69d88dSmrg/** 123af69d88dSmrg * glXQueryRendererStringMESA will return \c NULL if the query_render_string 124af69d88dSmrg * vtable entry is \c NULL. It will also not segfault. 125af69d88dSmrg */ 126af69d88dSmrgTEST_F(query_renderer_string_test, null_query_render_string) 127af69d88dSmrg{ 128af69d88dSmrg struct glx_screen_vtable vtable = { 129af69d88dSmrg NULL, 130af69d88dSmrg NULL, 131af69d88dSmrg NULL, 132af69d88dSmrg NULL 133af69d88dSmrg }; 134af69d88dSmrg 135af69d88dSmrg scr.vtable = &vtable; 136af69d88dSmrg 137af69d88dSmrg if (setjmp(jmp) == 0) { 138af69d88dSmrg const char *str = 139af69d88dSmrg glXQueryRendererStringMESA(&dpy, 0, 0, GLX_RENDERER_VENDOR_ID_MESA); 140af69d88dSmrg EXPECT_EQ((char *)0, str); 141af69d88dSmrg } else { 142af69d88dSmrg EXPECT_FALSE(got_sigsegv); 143af69d88dSmrg } 144af69d88dSmrg} 145af69d88dSmrg 146af69d88dSmrg/** 147af69d88dSmrg * glXQueryRendererStringMESA will not call the screen query_render_string 148af69d88dSmrg * function with an invalid GLX enum value, and it will return NULL. 149af69d88dSmrg */ 150af69d88dSmrgTEST_F(query_renderer_string_test, invalid_attribute) 151af69d88dSmrg{ 152af69d88dSmrg static const attribute_test_vector invalid_attributes[] = { 153af69d88dSmrg /* These values are just plain invalid for use with this extension. 154af69d88dSmrg */ 155af69d88dSmrg E(0), 156af69d88dSmrg E(GLX_VENDOR), 157af69d88dSmrg E(GLX_VERSION), 158af69d88dSmrg E(GLX_EXTENSIONS), 159af69d88dSmrg E(GLX_RENDERER_VENDOR_ID_MESA + 0x10000), 160af69d88dSmrg E(GLX_RENDERER_DEVICE_ID_MESA + 0x10000), 161af69d88dSmrg 162af69d88dSmrg /* These enums are part of the extension, but they are not allowed for 163af69d88dSmrg * the string query. 164af69d88dSmrg */ 165af69d88dSmrg E(GLX_RENDERER_VERSION_MESA), 166af69d88dSmrg E(GLX_RENDERER_ACCELERATED_MESA), 167af69d88dSmrg E(GLX_RENDERER_VIDEO_MEMORY_MESA), 168af69d88dSmrg E(GLX_RENDERER_UNIFIED_MEMORY_ARCHITECTURE_MESA), 169af69d88dSmrg E(GLX_RENDERER_PREFERRED_PROFILE_MESA), 170af69d88dSmrg E(GLX_RENDERER_OPENGL_CORE_PROFILE_VERSION_MESA), 171af69d88dSmrg E(GLX_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION_MESA), 172af69d88dSmrg E(GLX_RENDERER_OPENGL_ES_PROFILE_VERSION_MESA), 173af69d88dSmrg E(GLX_RENDERER_OPENGL_ES2_PROFILE_VERSION_MESA), 174af69d88dSmrg }; 175af69d88dSmrg 176af69d88dSmrg for (unsigned i = 0; i < ARRAY_SIZE(invalid_attributes); i++) { 177af69d88dSmrg query_renderer_integer_called = false; 178af69d88dSmrg query_renderer_string_called = false; 179af69d88dSmrg 180af69d88dSmrg const char *str = 181af69d88dSmrg glXQueryRendererStringMESA(&dpy, 0, 0, invalid_attributes[i].value); 182af69d88dSmrg EXPECT_EQ((char *)0, str) << invalid_attributes[i].string; 183af69d88dSmrg EXPECT_FALSE(query_renderer_integer_called) 184af69d88dSmrg << invalid_attributes[i].string; 185af69d88dSmrg EXPECT_FALSE(query_renderer_string_called) 186af69d88dSmrg << invalid_attributes[i].string; 187af69d88dSmrg } 188af69d88dSmrg} 189af69d88dSmrg 190af69d88dSmrg/** 191af69d88dSmrg * glXQueryRendererStringMESA will not call GetGLXScreenConfigs if the display 192af69d88dSmrg * pointer is \c NULL. It will also not segfault. 193af69d88dSmrg */ 194af69d88dSmrgTEST_F(query_renderer_string_test, null_display_pointer) 195af69d88dSmrg{ 196af69d88dSmrg if (setjmp(jmp) == 0) { 197af69d88dSmrg GetGLXScreenConfigs_called = false; 198af69d88dSmrg 199af69d88dSmrg const char *str = 200af69d88dSmrg glXQueryRendererStringMESA(NULL, 0, 0, GLX_RENDERER_VENDOR_ID_MESA); 201af69d88dSmrg EXPECT_EQ((char *)0, str); 202af69d88dSmrg EXPECT_FALSE(GetGLXScreenConfigs_called); 203af69d88dSmrg } else { 204af69d88dSmrg EXPECT_FALSE(got_sigsegv); 205af69d88dSmrg } 206af69d88dSmrg} 207af69d88dSmrg 208af69d88dSmrg/** 209af69d88dSmrg * glXQueryRendererStringMESA will return error if GetGLXScreenConfigs returns 210af69d88dSmrg * NULL. It will also not segfault. 211af69d88dSmrg */ 212af69d88dSmrgTEST_F(query_renderer_string_test, null_screen_pointer) 213af69d88dSmrg{ 214af69d88dSmrg psc = NULL; 215af69d88dSmrg 216af69d88dSmrg if (setjmp(jmp) == 0) { 217af69d88dSmrg GetGLXScreenConfigs_called = false; 218af69d88dSmrg 219af69d88dSmrg const char *str = 220af69d88dSmrg glXQueryRendererStringMESA(&dpy, 0, 0, GLX_RENDERER_VENDOR_ID_MESA); 221af69d88dSmrg EXPECT_EQ((char *)0, str); 222af69d88dSmrg EXPECT_TRUE(GetGLXScreenConfigs_called); 223af69d88dSmrg } else { 224af69d88dSmrg EXPECT_FALSE(got_sigsegv); 225af69d88dSmrg } 226af69d88dSmrg} 227af69d88dSmrg 228af69d88dSmrg/** 229af69d88dSmrg * glXQueryRendererStringMESA will not call the screen query_render_string 230af69d88dSmrg * function if the renderer is invalid, and it will return NULL. 231af69d88dSmrg */ 232af69d88dSmrgTEST_F(query_renderer_string_test, invalid_renderer_index) 233af69d88dSmrg{ 234af69d88dSmrg static const int invalid_renderer_indices[] = { 235af69d88dSmrg -1, 236af69d88dSmrg 1, 237af69d88dSmrg 999, 238af69d88dSmrg }; 239af69d88dSmrg 240af69d88dSmrg if (setjmp(jmp) == 0) { 241af69d88dSmrg for (unsigned i = 0; i < ARRAY_SIZE(invalid_renderer_indices); i++) { 242af69d88dSmrg const char *str = 243af69d88dSmrg glXQueryRendererStringMESA(&dpy, 0, 244af69d88dSmrg invalid_renderer_indices[i], 245af69d88dSmrg GLX_RENDERER_VENDOR_ID_MESA); 246af69d88dSmrg EXPECT_EQ((char *)0, str) << invalid_renderer_indices[i]; 247af69d88dSmrg EXPECT_FALSE(query_renderer_integer_called) 248af69d88dSmrg << invalid_renderer_indices[i]; 249af69d88dSmrg EXPECT_FALSE(query_renderer_string_called) 250af69d88dSmrg << invalid_renderer_indices[i]; 251af69d88dSmrg } 252af69d88dSmrg } else { 253af69d88dSmrg EXPECT_FALSE(got_sigsegv); 254af69d88dSmrg } 255af69d88dSmrg} 256af69d88dSmrg 257af69d88dSmrg/** 258af69d88dSmrg * glXQueryCurrentRendererStringMESA will return error if there is no context 259af69d88dSmrg * current. It will also not segfault. 260af69d88dSmrg */ 261af69d88dSmrgTEST_F(query_renderer_string_test, no_current_context) 262af69d88dSmrg{ 263af69d88dSmrg if (setjmp(jmp) == 0) { 264af69d88dSmrg const char *str = 265af69d88dSmrg glXQueryCurrentRendererStringMESA(GLX_RENDERER_VENDOR_ID_MESA); 266af69d88dSmrg EXPECT_EQ((char *)0, str); 267af69d88dSmrg } else { 268af69d88dSmrg EXPECT_FALSE(got_sigsegv); 269af69d88dSmrg } 270af69d88dSmrg} 271af69d88dSmrg 272af69d88dSmrg/** 273af69d88dSmrg * glXQueryCurrentRendererIntegerMESA will return \c NULL if the 274af69d88dSmrg * query_render_string vtable entry is \c NULL. It will also not segfault. 275af69d88dSmrg */ 276af69d88dSmrgTEST_F(query_renderer_integer_test, null_query_render_string) 277af69d88dSmrg{ 278af69d88dSmrg struct glx_screen_vtable vtable = { 279af69d88dSmrg NULL, 280af69d88dSmrg NULL, 281af69d88dSmrg NULL, 282af69d88dSmrg NULL 283af69d88dSmrg }; 284af69d88dSmrg 285af69d88dSmrg scr.vtable = &vtable; 286af69d88dSmrg 287af69d88dSmrg if (setjmp(jmp) == 0) { 288af69d88dSmrg unsigned value = 0xDEADBEEF; 289af69d88dSmrg Bool success = glXQueryRendererIntegerMESA(&dpy, 0, 0, 290af69d88dSmrg GLX_RENDERER_VENDOR_ID_MESA, 291af69d88dSmrg &value); 292af69d88dSmrg EXPECT_FALSE(success); 293af69d88dSmrg EXPECT_EQ(0xDEADBEEF, value); 294af69d88dSmrg } else { 295af69d88dSmrg EXPECT_FALSE(got_sigsegv); 296af69d88dSmrg } 297af69d88dSmrg} 298af69d88dSmrg 299af69d88dSmrg/** 300af69d88dSmrg * glXQueryCurrentRendererIntegerMESA will not call the screen 301af69d88dSmrg * query_render_string function with an invalid GLX enum value, and it will 302af69d88dSmrg * return NULL. 303af69d88dSmrg */ 304af69d88dSmrgTEST_F(query_renderer_integer_test, invalid_attribute) 305af69d88dSmrg{ 306af69d88dSmrg static const attribute_test_vector invalid_attributes[] = { 307af69d88dSmrg /* These values are just plain invalid for use with this extension. 308af69d88dSmrg */ 309af69d88dSmrg E(0), 310af69d88dSmrg E(GLX_VENDOR), 311af69d88dSmrg E(GLX_VERSION), 312af69d88dSmrg E(GLX_EXTENSIONS), 313af69d88dSmrg E(GLX_RENDERER_VENDOR_ID_MESA + 0x10000), 314af69d88dSmrg E(GLX_RENDERER_DEVICE_ID_MESA + 0x10000), 315af69d88dSmrg E(GLX_RENDERER_VERSION_MESA + 0x10000), 316af69d88dSmrg E(GLX_RENDERER_ACCELERATED_MESA + 0x10000), 317af69d88dSmrg E(GLX_RENDERER_VIDEO_MEMORY_MESA + 0x10000), 318af69d88dSmrg E(GLX_RENDERER_UNIFIED_MEMORY_ARCHITECTURE_MESA + 0x10000), 319af69d88dSmrg E(GLX_RENDERER_PREFERRED_PROFILE_MESA + 0x10000), 320af69d88dSmrg E(GLX_RENDERER_OPENGL_CORE_PROFILE_VERSION_MESA + 0x10000), 321af69d88dSmrg E(GLX_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION_MESA + 0x10000), 322af69d88dSmrg E(GLX_RENDERER_OPENGL_ES_PROFILE_VERSION_MESA + 0x10000), 323af69d88dSmrg E(GLX_RENDERER_OPENGL_ES2_PROFILE_VERSION_MESA + 0x10000), 324af69d88dSmrg }; 325af69d88dSmrg 326af69d88dSmrg for (unsigned i = 0; i < ARRAY_SIZE(invalid_attributes); i++) { 327af69d88dSmrg query_renderer_integer_called = false; 328af69d88dSmrg query_renderer_string_called = false; 329af69d88dSmrg 330af69d88dSmrg unsigned value = 0xDEADBEEF; 331af69d88dSmrg Bool success = 332af69d88dSmrg glXQueryRendererIntegerMESA(&dpy, 0, 0, 333af69d88dSmrg invalid_attributes[i].value, 334af69d88dSmrg &value); 335af69d88dSmrg EXPECT_FALSE(success) << invalid_attributes[i].string; 336af69d88dSmrg EXPECT_EQ(0xDEADBEEF, value) << invalid_attributes[i].string; 337af69d88dSmrg EXPECT_FALSE(query_renderer_integer_called) 338af69d88dSmrg << invalid_attributes[i].string; 339af69d88dSmrg EXPECT_FALSE(query_renderer_string_called) 340af69d88dSmrg << invalid_attributes[i].string; 341af69d88dSmrg } 342af69d88dSmrg} 343af69d88dSmrg 344af69d88dSmrg/** 345af69d88dSmrg * glXQueryCurrentRendererIntegerMESA will not call GetGLXScreenConfigs if the 346af69d88dSmrg * display pointer is \c NULL. It will also not segfault. 347af69d88dSmrg */ 348af69d88dSmrgTEST_F(query_renderer_integer_test, null_display_pointer) 349af69d88dSmrg{ 350af69d88dSmrg if (setjmp(jmp) == 0) { 351af69d88dSmrg GetGLXScreenConfigs_called = false; 352af69d88dSmrg 353af69d88dSmrg unsigned value = 0xDEADBEEF; 354af69d88dSmrg Bool success = 355af69d88dSmrg glXQueryRendererIntegerMESA(NULL, 0, 0, GLX_RENDERER_VENDOR_ID_MESA, 356af69d88dSmrg &value); 357af69d88dSmrg EXPECT_FALSE(success); 358af69d88dSmrg EXPECT_EQ(0xDEADBEEF, value); 359af69d88dSmrg EXPECT_FALSE(GetGLXScreenConfigs_called); 360af69d88dSmrg } else { 361af69d88dSmrg EXPECT_FALSE(got_sigsegv); 362af69d88dSmrg } 363af69d88dSmrg} 364af69d88dSmrg 365af69d88dSmrg/** 366af69d88dSmrg * glXQueryCurrentRendererIntegerMESA will return error if GetGLXScreenConfigs 367af69d88dSmrg * returns NULL. It will also not segfault. 368af69d88dSmrg */ 369af69d88dSmrgTEST_F(query_renderer_integer_test, null_screen_pointer) 370af69d88dSmrg{ 371af69d88dSmrg psc = NULL; 372af69d88dSmrg 373af69d88dSmrg if (setjmp(jmp) == 0) { 374af69d88dSmrg GetGLXScreenConfigs_called = false; 375af69d88dSmrg 376af69d88dSmrg unsigned value = 0xDEADBEEF; 377af69d88dSmrg Bool success = 378af69d88dSmrg glXQueryRendererIntegerMESA(&dpy, 0, 0, GLX_RENDERER_VENDOR_ID_MESA, 379af69d88dSmrg &value); 380af69d88dSmrg EXPECT_FALSE(success); 381af69d88dSmrg EXPECT_EQ(0xDEADBEEF, value); 382af69d88dSmrg EXPECT_TRUE(GetGLXScreenConfigs_called); 383af69d88dSmrg } else { 384af69d88dSmrg EXPECT_FALSE(got_sigsegv); 385af69d88dSmrg } 386af69d88dSmrg} 387af69d88dSmrg 388af69d88dSmrg/** 389af69d88dSmrg * glXQueryRendererIntegerMESA will not call the screen query_render_integer 390af69d88dSmrg * function if the renderer is invalid, and it will return NULL. 391af69d88dSmrg */ 392af69d88dSmrgTEST_F(query_renderer_integer_test, invalid_renderer_index) 393af69d88dSmrg{ 394af69d88dSmrg static const int invalid_renderer_indices[] = { 395af69d88dSmrg -1, 396af69d88dSmrg 1, 397af69d88dSmrg 999, 398af69d88dSmrg }; 399af69d88dSmrg 400af69d88dSmrg if (setjmp(jmp) == 0) { 401af69d88dSmrg for (unsigned i = 0; i < ARRAY_SIZE(invalid_renderer_indices); i++) { 402af69d88dSmrg unsigned value = 0xDEADBEEF; 403af69d88dSmrg Bool success = 404af69d88dSmrg glXQueryRendererIntegerMESA(&dpy, 0, 405af69d88dSmrg invalid_renderer_indices[i], 406af69d88dSmrg GLX_RENDERER_VENDOR_ID_MESA, 407af69d88dSmrg &value); 408af69d88dSmrg EXPECT_FALSE(success) << invalid_renderer_indices[i]; 409af69d88dSmrg EXPECT_EQ(0xDEADBEEF, value) << invalid_renderer_indices[i]; 410af69d88dSmrg EXPECT_FALSE(query_renderer_integer_called) 411af69d88dSmrg << invalid_renderer_indices[i]; 412af69d88dSmrg EXPECT_FALSE(query_renderer_string_called) 413af69d88dSmrg << invalid_renderer_indices[i]; 414af69d88dSmrg } 415af69d88dSmrg } else { 416af69d88dSmrg EXPECT_FALSE(got_sigsegv); 417af69d88dSmrg } 418af69d88dSmrg} 419af69d88dSmrg 420af69d88dSmrg/** 421af69d88dSmrg * glXQueryCurrentRendererIntegerMESA will return error if there is no context 422af69d88dSmrg * current. It will also not segfault. 423af69d88dSmrg */ 424af69d88dSmrgTEST_F(query_renderer_integer_test, no_current_context) 425af69d88dSmrg{ 426af69d88dSmrg if (setjmp(jmp) == 0) { 427af69d88dSmrg unsigned value = 0xDEADBEEF; 428af69d88dSmrg Bool success = 429af69d88dSmrg glXQueryCurrentRendererIntegerMESA(GLX_RENDERER_VENDOR_ID_MESA, 430af69d88dSmrg &value); 431af69d88dSmrg EXPECT_FALSE(success); 432af69d88dSmrg EXPECT_EQ(0xDEADBEEF, value); 433af69d88dSmrg } else { 434af69d88dSmrg EXPECT_FALSE(got_sigsegv); 435af69d88dSmrg } 436af69d88dSmrg} 437