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