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