conditional-expr.c revision 9158804749356f88be8c5a3bade75b761846273c
1d7d5f0223bd30dfd618762349c6209dd1d5ea3e6Daniel Dunbar// RUN: clang-cc -fsyntax-only -verify -pedantic %s
2b6d54e56a5c65c2728080578b84374c3c594daecSteve Naroffvoid foo() {
3b6d54e56a5c65c2728080578b84374c3c594daecSteve Naroff  *(0 ? (double *)0 : (void *)0) = 0;
4890d93eec45f2ba720dce98e34a1a904697ae842Steve Naroff  // FIXME: GCC doesn't consider the the following two statements to be errors.
5aa58f00ebba5f14955001736b7aea20bb5bd91e6Steve Naroff  *(0 ? (double *)0 : (void *)(int *)0) = 0; // expected-error {{incomplete type 'void' is not assignable}}
6aa58f00ebba5f14955001736b7aea20bb5bd91e6Steve Naroff  *(0 ? (double *)0 : (void *)(double *)0) = 0; // expected-error {{incomplete type 'void' is not assignable}}
7890d93eec45f2ba720dce98e34a1a904697ae842Steve Naroff  *(0 ? (double *)0 : (int *)(void *)0) = 0; // expected-error {{incomplete type 'void' is not assignable}} expected-warning {{pointer type mismatch ('double *' and 'int *')}}
8aaffbf7c790a324ed114184db771aae2d2e9151cSteve Naroff  *(0 ? (double *)0 : (double *)(void *)0) = 0;
9aaffbf7c790a324ed114184db771aae2d2e9151cSteve Naroff  *((void *) 0) = 0; // expected-error {{incomplete type 'void' is not assignable}}
10b6d54e56a5c65c2728080578b84374c3c594daecSteve Naroff  double *dp;
11b6d54e56a5c65c2728080578b84374c3c594daecSteve Naroff  int *ip;
12b6d54e56a5c65c2728080578b84374c3c594daecSteve Naroff  void *vp;
13b6d54e56a5c65c2728080578b84374c3c594daecSteve Naroff
14b6d54e56a5c65c2728080578b84374c3c594daecSteve Naroff  dp = vp;
15b6d54e56a5c65c2728080578b84374c3c594daecSteve Naroff  vp = dp;
16aaffbf7c790a324ed114184db771aae2d2e9151cSteve Naroff  ip = dp; // expected-warning {{incompatible pointer types assigning 'double *', expected 'int *'}}
17aaffbf7c790a324ed114184db771aae2d2e9151cSteve Naroff  dp = ip; // expected-warning {{incompatible pointer types assigning 'int *', expected 'double *'}}
18b6d54e56a5c65c2728080578b84374c3c594daecSteve Naroff  dp = 0 ? (double *)0 : (void *)0;
19b6d54e56a5c65c2728080578b84374c3c594daecSteve Naroff  vp = 0 ? (double *)0 : (void *)0;
20aaffbf7c790a324ed114184db771aae2d2e9151cSteve Naroff  ip = 0 ? (double *)0 : (void *)0; // expected-warning {{incompatible pointer types assigning 'double *', expected 'int *'}}
21f76f5ed0505bc4b9c3c7d6003335b34cdf9afe47Eli Friedman
22f76f5ed0505bc4b9c3c7d6003335b34cdf9afe47Eli Friedman  const int *cip;
23f76f5ed0505bc4b9c3c7d6003335b34cdf9afe47Eli Friedman  vp = (0 ? vp : cip); // expected-warning {{discards qualifiers}}
24f76f5ed0505bc4b9c3c7d6003335b34cdf9afe47Eli Friedman  vp = (0 ? cip : vp); // expected-warning {{discards qualifiers}}
254c721d381fb279899337d120edd4a24d405e56b2Eli Friedman
264c721d381fb279899337d120edd4a24d405e56b2Eli Friedman  int i = 2;
274c721d381fb279899337d120edd4a24d405e56b2Eli Friedman  int (*pf)[2];
284c721d381fb279899337d120edd4a24d405e56b2Eli Friedman  int (*pv)[i];
294c721d381fb279899337d120edd4a24d405e56b2Eli Friedman  pf = (i ? pf : pv);
30bab96968886f4b77083f4e26a28986ddb1e42d67Eli Friedman
31bab96968886f4b77083f4e26a28986ddb1e42d67Eli Friedman  enum {xxx,yyy,zzz} e, *ee;
32bab96968886f4b77083f4e26a28986ddb1e42d67Eli Friedman  short x;
33bab96968886f4b77083f4e26a28986ddb1e42d67Eli Friedman  ee = ee ? &x : ee ? &i : &e; // expected-warning {{pointer type mismatch}}
344b3f9b367c16e494c181d6f03d53497ae1275fbeEli Friedman
354b3f9b367c16e494c181d6f03d53497ae1275fbeEli Friedman  typedef void *asdf;
364b3f9b367c16e494c181d6f03d53497ae1275fbeEli Friedman  *(0 ? (asdf) 0 : &x) = 10;
37b6d54e56a5c65c2728080578b84374c3c594daecSteve Naroff}
38b6d54e56a5c65c2728080578b84374c3c594daecSteve Naroff
39e701c0a953d05c3403a74fdb449a8f4a1e4e6594Steve Naroffint Postgresql() {
40e701c0a953d05c3403a74fdb449a8f4a1e4e6594Steve Naroff  char x;
41e701c0a953d05c3403a74fdb449a8f4a1e4e6594Steve Naroff  return ((((&x) != ((void *) 0)) ? (*(&x) = ((char) 1)) : (void) ((void *) 0)), (unsigned long) ((void *) 0)); // expected-warning {{C99 forbids conditional expressions with only one void side}}
42e701c0a953d05c3403a74fdb449a8f4a1e4e6594Steve Naroff}
439158804749356f88be8c5a3bade75b761846273cSteve Naroff
449158804749356f88be8c5a3bade75b761846273cSteve Naroff#define nil ((void*) 0)
459158804749356f88be8c5a3bade75b761846273cSteve Naroff
469158804749356f88be8c5a3bade75b761846273cSteve Naroffextern int f1(void);
479158804749356f88be8c5a3bade75b761846273cSteve Naroff
489158804749356f88be8c5a3bade75b761846273cSteve Naroffint f0(int a) {
499158804749356f88be8c5a3bade75b761846273cSteve Naroff  // GCC considers this a warning.
509158804749356f88be8c5a3bade75b761846273cSteve Naroff  return a ? f1() : nil; // expected-warning {{pointer/integer type mismatch in conditional expression ('int' and 'void *')}} expected-warning {{incompatible pointer to integer conversion returning 'void *', expected 'int'}}
519158804749356f88be8c5a3bade75b761846273cSteve Naroff}
52