|  | // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | // This is a "No Compile Test" suite. | 
|  | // http://dev.chromium.org/developers/testing/no-compile-tests | 
|  |  | 
|  | #include "base/callback.h" | 
|  |  | 
|  | namespace base { | 
|  |  | 
|  | class Parent { | 
|  | }; | 
|  |  | 
|  | class Child : Parent { | 
|  | }; | 
|  |  | 
|  | #if defined(NCTEST_EQUALS_REQUIRES_SAMETYPE)  // [r"fatal error: no viable conversion from 'RepeatingCallback<int \(\)>' to 'const RepeatingCallback<void \(\)>'"] | 
|  |  | 
|  | // Attempting to call comparison function on two callbacks of different type. | 
|  | // | 
|  | // This should be a compile time failure because each callback type should be | 
|  | // considered distinct. | 
|  | void WontCompile() { | 
|  | Closure c1; | 
|  | Callback<int()> c2; | 
|  | c1.Equals(c2); | 
|  | } | 
|  |  | 
|  | #elif defined(NCTEST_CONSTRUCTION_FROM_SUBTYPE)  // [r"fatal error: no viable conversion from 'Callback<base::Parent \(\)>' to 'Callback<base::Child \(\)>'"] | 
|  |  | 
|  | // Construction of Callback<A> from Callback<B> if A is supertype of B. | 
|  | // | 
|  | // While this is technically safe, most people aren't used to it when coding | 
|  | // C++ so if this is happening, it is almost certainly an error. | 
|  | void WontCompile() { | 
|  | Callback<Parent()> cb_a; | 
|  | Callback<Child()> cb_b = cb_a; | 
|  | } | 
|  |  | 
|  | #elif defined(NCTEST_ASSIGNMENT_FROM_SUBTYPE)  // [r"fatal error: no viable overloaded '='"] | 
|  |  | 
|  | // Assignment of Callback<A> from Callback<B> if A is supertype of B. | 
|  | // See explanation for NCTEST_CONSTRUCTION_FROM_SUBTYPE | 
|  | void WontCompile() { | 
|  | Callback<Parent()> cb_a; | 
|  | Callback<Child()> cb_b; | 
|  | cb_a = cb_b; | 
|  | } | 
|  |  | 
|  | #endif | 
|  |  | 
|  | }  // namespace base |