1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s
2a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
3a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
42850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl
52850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl// Tests that dependent expressions are always allowed, whereas non-dependent
62850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl// are checked as usual.
72850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl
82850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl#include <stddef.h>
92850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl
102850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl// Fake typeid, lacking a typeinfo header.
112850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redlnamespace std { class type_info {}; }
122850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl
13220ccbf2c9ef97034cce80561f9f46c4f1f63bc7John McCallstruct dummy {}; // expected-note 3 {{candidate constructor (the implicit copy constructor)}}
14a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar#if __cplusplus >= 201103L // C++11 or later
15a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// expected-note@-2 3 {{candidate constructor (the implicit move constructor) not viable}}
16a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar#endif
172850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl
189983cc110422a2e976191a0ce6ac4f1d7b634cc0Douglas Gregortemplate<typename T>
199983cc110422a2e976191a0ce6ac4f1d7b634cc0Douglas Gregorint f0(T x) {
209983cc110422a2e976191a0ce6ac4f1d7b634cc0Douglas Gregor  return (sizeof(x) == sizeof(int))? 0 : (sizeof(x) == sizeof(double))? 1 : 2;
219983cc110422a2e976191a0ce6ac4f1d7b634cc0Douglas Gregor}
229983cc110422a2e976191a0ce6ac4f1d7b634cc0Douglas Gregor
232850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redltemplate <typename T, typename U>
249983cc110422a2e976191a0ce6ac4f1d7b634cc0Douglas GregorT f1(T t1, U u1, int i1)
252850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl{
262850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl  T t2 = i1;
272850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl  t2 = i1 + u1;
282850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl  ++u1;
292850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl  u1++;
302850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl  int i2 = u1;
312850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl
322850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl  i1 = t1[u1];
332850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl  i1 *= t1;
342850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl
352850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl  i1(u1, t1); // error
362850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl  u1(i1, t1);
372850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl
382850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl  U u2 = (T)i1;
392850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl  static_cast<void>(static_cast<U>(reinterpret_cast<T>(
402850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl    dynamic_cast<U>(const_cast<T>(i1)))));
412850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl
422850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl  new U(i1, t1);
43089407be3fb616fb1246f2aee29b8a9c58ec7807Douglas Gregor  new int(t1, u1);
442850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl  new (t1, u1) int;
452850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl  delete t1;
462850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl
47cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman  dummy d1 = sizeof(t1); // expected-error {{no viable conversion}}
487abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor  dummy d2 = offsetof(T, foo); // expected-error {{no viable conversion}}
49cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman  dummy d3 = __alignof(u1); // expected-error {{no viable conversion}}
500c42bb653dc40b1caae010618831e320af824b18Chris Lattner  i1 = typeid(t1); // expected-error {{assigning to 'int' from incompatible type 'const std::type_info'}}
512850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl
522850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl  return u1;
532850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl}
549807a2e0ddb1eafb8725dbf0247271a4a694037bRichard Smith
559807a2e0ddb1eafb8725dbf0247271a4a694037bRichard Smithtemplate<typename T>
5693d6b07cd79d74e343d81c0e8fb5365376a33097Richard Smithvoid f2(__restrict T x) {} // expected-note {{substitution failure [with T = int]: restrict requires a pointer or reference ('int' is invalid}}
579807a2e0ddb1eafb8725dbf0247271a4a694037bRichard Smith
589807a2e0ddb1eafb8725dbf0247271a4a694037bRichard Smithvoid f3() {
599807a2e0ddb1eafb8725dbf0247271a4a694037bRichard Smith  f2<int*>(0);
609807a2e0ddb1eafb8725dbf0247271a4a694037bRichard Smith  f2<int>(0); // expected-error {{no matching function for call to 'f2'}}
619807a2e0ddb1eafb8725dbf0247271a4a694037bRichard Smith}
62