19b29f4fe3d0600edf6ba00d48f2d4f2b1984f247David Blaikie// RUN: %clang %s -ffreestanding -Wno-int-to-pointer-cast -fsyntax-only -Xclang -verify -pedantic -fpascal-strings -std=c99 204de9937d861105a7bb21f88b89705537f2663b7Chris Lattner 3f04ec6774f88d3c0d486eba04803e34a9513037fEli Friedman#include <stdint.h> 4f04ec6774f88d3c0d486eba04803e34a9513037fEli Friedman#include <limits.h> 5f04ec6774f88d3c0d486eba04803e34a9513037fEli Friedman 609de1767990d4828bcaf0dd22033a5dddeecbe08Eli Friedmanint a() {int p; *(1 ? &p : (void*)(0 && (a(),1))) = 10;} // expected-error {{incomplete type 'void' is not assignable}} 704de9937d861105a7bb21f88b89705537f2663b7Chris Lattner 804de9937d861105a7bb21f88b89705537f2663b7Chris Lattner// rdar://6091492 - ?: with __builtin_constant_p as the operand is an i-c-e. 904de9937d861105a7bb21f88b89705537f2663b7Chris Lattnerint expr; 1004de9937d861105a7bb21f88b89705537f2663b7Chris Lattnerchar w[__builtin_constant_p(expr) ? expr : 1]; 1104de9937d861105a7bb21f88b89705537f2663b7Chris Lattner 1283a1c5c8996a68d9be4e54de27565ce037785df1Abramo Bagnarachar v[sizeof(__builtin_constant_p(0)) == sizeof(int) ? 1 : -1]; 1304de9937d861105a7bb21f88b89705537f2663b7Chris Lattner 1432cb47174304bc7ec11478b9497c4e10f48273d9Richard Smithint implicitConversion = 1.0; 1532cb47174304bc7ec11478b9497c4e10f48273d9Richard Smithchar floatArith[(int)(1.0+2.0)]; // expected-warning {{must be an integer constant expression}} 1632cb47174304bc7ec11478b9497c4e10f48273d9Richard Smith 1742b83dde7c700b34f9435ad746984169888ae705Chris Lattner// __builtin_constant_p as the condition of ?: allows arbitrary foldable 1842b83dde7c700b34f9435ad746984169888ae705Chris Lattner// constants to be transmogrified into i-c-e's. 1942b83dde7c700b34f9435ad746984169888ae705Chris Lattnerchar b[__builtin_constant_p((int)(1.0+2.0)) ? (int)(1.0+2.0) : -1]; 2042b83dde7c700b34f9435ad746984169888ae705Chris Lattner 2142b83dde7c700b34f9435ad746984169888ae705Chris Lattnerstruct c { 22282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith int a : ( 2342b83dde7c700b34f9435ad746984169888ae705Chris Lattner __builtin_constant_p((int)(1.0+2.0)) ? (int)(1.0+ 24282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith expr // expected-error {{expression is not an integer constant expression}} 2542b83dde7c700b34f9435ad746984169888ae705Chris Lattner ) : -1); 2642b83dde7c700b34f9435ad746984169888ae705Chris Lattner}; 2742b83dde7c700b34f9435ad746984169888ae705Chris Lattner 2842b83dde7c700b34f9435ad746984169888ae705Chris Lattner 2942b83dde7c700b34f9435ad746984169888ae705Chris Lattner 3004de9937d861105a7bb21f88b89705537f2663b7Chris Lattner 3104de9937d861105a7bb21f88b89705537f2663b7Chris Lattnervoid test1(int n, int* p) { *(n ? p : (void *)(7-7)) = 1; } 3204de9937d861105a7bb21f88b89705537f2663b7Chris Lattnervoid test2(int n, int* p) { *(n ? p : (void *)0) = 1; } 3304de9937d861105a7bb21f88b89705537f2663b7Chris Lattner 3404de9937d861105a7bb21f88b89705537f2663b7Chris Lattner 3504de9937d861105a7bb21f88b89705537f2663b7Chris Lattner 3604de9937d861105a7bb21f88b89705537f2663b7Chris Lattnerchar array[1024/(sizeof (long))]; 3704de9937d861105a7bb21f88b89705537f2663b7Chris Lattner 3804de9937d861105a7bb21f88b89705537f2663b7Chris Lattnerint x['\xBb' == (char) 187 ? 1: -1]; 3904de9937d861105a7bb21f88b89705537f2663b7Chris Lattner 4004de9937d861105a7bb21f88b89705537f2663b7Chris Lattner// PR1992 4104de9937d861105a7bb21f88b89705537f2663b7Chris Lattnervoid func(int x) 4204de9937d861105a7bb21f88b89705537f2663b7Chris Lattner{ 4304de9937d861105a7bb21f88b89705537f2663b7Chris Lattner switch (x) { 4404de9937d861105a7bb21f88b89705537f2663b7Chris Lattner case sizeof("abc"): break; 4504de9937d861105a7bb21f88b89705537f2663b7Chris Lattner case sizeof("loooong"): func(4); 4604de9937d861105a7bb21f88b89705537f2663b7Chris Lattner case sizeof("\ploooong"): func(4); 4704de9937d861105a7bb21f88b89705537f2663b7Chris Lattner } 4804de9937d861105a7bb21f88b89705537f2663b7Chris Lattner} 4904de9937d861105a7bb21f88b89705537f2663b7Chris Lattner 5004de9937d861105a7bb21f88b89705537f2663b7Chris Lattner 5104de9937d861105a7bb21f88b89705537f2663b7Chris Lattner// rdar://4213768 5204de9937d861105a7bb21f88b89705537f2663b7Chris Lattnerint expr; 5304de9937d861105a7bb21f88b89705537f2663b7Chris Lattnerchar y[__builtin_constant_p(expr) ? -1 : 1]; 5404de9937d861105a7bb21f88b89705537f2663b7Chris Lattnerchar z[__builtin_constant_p(4) ? 1 : -1]; 5504de9937d861105a7bb21f88b89705537f2663b7Chris Lattner 56f04ec6774f88d3c0d486eba04803e34a9513037fEli Friedman// Comma tests 5771b8fb5d4233420d2ed2f150a54ea61431bd8684Eli Friedmanint comma1[0?1,2:3]; 5871b8fb5d4233420d2ed2f150a54ea61431bd8684Eli Friedmanint comma2[1||(1,2)]; // expected-warning {{use of logical '||' with constant operand}} \ 599b127f3b44e685cbe513595b7e0115b0884b0604Matt Beaumont-Gay // expected-note {{use '|' for a bitwise operation}} 6071b8fb5d4233420d2ed2f150a54ea61431bd8684Eli Friedmanint comma3[(1,2)]; // expected-warning {{size of static array must be an integer constant expression}} 61f04ec6774f88d3c0d486eba04803e34a9513037fEli Friedman 62f04ec6774f88d3c0d486eba04803e34a9513037fEli Friedman// Pointer + __builtin_constant_p 63f04ec6774f88d3c0d486eba04803e34a9513037fEli Friedmanchar pbcp[__builtin_constant_p(4) ? (intptr_t)&expr : 0]; // expected-error {{variable length array declaration not allowed at file scope}} 64f04ec6774f88d3c0d486eba04803e34a9513037fEli Friedman 6571b8fb5d4233420d2ed2f150a54ea61431bd8684Eli Friedmanint illegaldiv1a[1 || 1/0]; 6671b8fb5d4233420d2ed2f150a54ea61431bd8684Eli Friedmanint illegaldiv1b[1 && 1/0]; //expected-error{{variable length array declaration not allowed at file scope}} 67351ba91eaa6d30e523587b2d7ed676a5172c6e56Ted Kremenek 6871b8fb5d4233420d2ed2f150a54ea61431bd8684Eli Friedmanint illegaldiv2[1/0]; // expected-error {{variable length array declaration not allowed at file scope}} 69f04ec6774f88d3c0d486eba04803e34a9513037fEli Friedmanint illegaldiv3[INT_MIN / -1]; // expected-error {{variable length array declaration not allowed at file scope}} 703b332ab132fa85c83833d74d400f6e126f52fbd2John McCall// PR9262 7171b8fb5d4233420d2ed2f150a54ea61431bd8684Eli Friedmanint illegaldiv4[0 / (1 / 0)]; // expected-error {{variable length array declaration not allowed at file scope}} 72f04ec6774f88d3c0d486eba04803e34a9513037fEli Friedman 73eb32fde032a250091134db56a3aeaea6b09f6594Eli Friedmanint chooseexpr[__builtin_choose_expr(1, 1, expr)]; 74eb32fde032a250091134db56a3aeaea6b09f6594Eli Friedmanint realop[(__real__ 4) == 4 ? 1 : -1]; 75eb32fde032a250091134db56a3aeaea6b09f6594Eli Friedmanint imagop[(__imag__ 4) == 0 ? 1 : -1]; 769b403c555a294530305f40dfee859b73070de542Richard Smith 779b403c555a294530305f40dfee859b73070de542Richard Smithint *PR14729 = 0 ?: 1/0; // expected-error {{not a compile-time constant}} expected-warning 3{{}} 78