aboutsummaryrefslogblamecommitdiff
path: root/test/SemaCXX/warn-bool-conversion.cpp
blob: b3d136ecf2b13b05811a1e58e0973d3fd327eb25 (plain) (tree)
1
2
3
4
5
6
7
8
9
10

                                           
                                                                                                                           
 
                                                                                                                                            
 
                                                                                                                         


                                                                        

                                                                                                                                  

                           
                                                                                                                         








                                                                           
// RUN: %clang_cc1 -fsyntax-only -verify %s

int* j = false; // expected-warning{{initialization of pointer of type 'int *' to null from a constant boolean expression}}

void foo(int* i, int *j=(false)) // expected-warning{{initialization of pointer of type 'int *' to null from a constant boolean expression}}
{
  foo(false); // expected-warning{{initialization of pointer of type 'int *' to null from a constant boolean expression}}
  foo((int*)false); // no-warning: explicit cast
  foo(0); // no-warning: not a bool, even though its convertible to bool

  foo(false == true); // expected-warning{{initialization of pointer of type 'int *' to null from a constant boolean expression}}
  foo((42 + 24) < 32); // expected-warning{{initialization of pointer of type 'int *' to null from a constant boolean expression}}

  const bool kFlag = false;
  foo(kFlag); // expected-warning{{initialization of pointer of type 'int *' to null from a constant boolean expression}}
}

char f(struct Undefined*);
double f(...);

// Ensure that when using false in metaprogramming machinery its conversion
// isn't flagged.
template <int N> struct S {};
S<sizeof(f(false))> s;