Home | History | Annotate | Download | only in memory
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/basictypes.h"
      6 #include "base/memory/scoped_ptr.h"
      7 #include "base/memory/ref_counted.h"
      8 
      9 namespace {
     10 
     11 class Parent {
     12 };
     13 
     14 class Child : public Parent {
     15 };
     16 
     17 class RefCountedClass : public base::RefCountedThreadSafe<RefCountedClass> {
     18 };
     19 
     20 }  // namespace
     21 
     22 #if defined(NCTEST_NO_PASSAS_DOWNCAST)  // [r"invalid conversion from"]
     23 
     24 scoped_ptr<Child> DowncastUsingPassAs(scoped_ptr<Parent> object) {
     25   return object.PassAs<Child>();
     26 }
     27 
     28 #elif defined(NCTEST_NO_REF_COUNTED_SCOPED_PTR)  // [r"size of array is negative"]
     29 
     30 // scoped_ptr<> should not work for ref-counted objects.
     31 void WontCompile() {
     32   scoped_ptr<RefCountedClass> x;
     33 }
     34 
     35 #elif defined(NCTEST_NO_ARRAY_WITH_SIZE)  // [r"size of array is negative"]
     36 
     37 void WontCompile() {
     38   scoped_ptr<int[10]> x;
     39 }
     40 
     41 #elif defined(NCTEST_NO_PASS_FROM_ARRAY)  // [r"size of array is negative"]
     42 
     43 void WontCompile() {
     44   scoped_ptr<int[]> a;
     45   scoped_ptr<int*> b;
     46   b = a.Pass();
     47 }
     48 
     49 #elif defined(NCTEST_NO_PASS_TO_ARRAY)  // [r"no match for 'operator='"]
     50 
     51 void WontCompile() {
     52   scoped_ptr<int*> a;
     53   scoped_ptr<int[]> b;
     54   b = a.Pass();
     55 }
     56 
     57 #elif defined(NCTEST_NO_CONSTRUCT_FROM_ARRAY)  // [r"is private"]
     58 
     59 void WontCompile() {
     60   scoped_ptr<int[]> a;
     61   scoped_ptr<int*> b(a.Pass());
     62 }
     63 
     64 #elif defined(NCTEST_NO_CONSTRUCT_TO_ARRAY)  // [r"no matching function for call"]
     65 
     66 void WontCompile() {
     67   scoped_ptr<int*> a;
     68   scoped_ptr<int[]> b(a.Pass());
     69 }
     70 
     71 #elif defined(NCTEST_NO_CONSTRUCT_SCOPED_PTR_ARRAY_FROM_NULL)  // [r"is ambiguous"]
     72 
     73 void WontCompile() {
     74   scoped_ptr<int[]> x(NULL);
     75 }
     76 
     77 #elif defined(NCTEST_NO_CONSTRUCT_SCOPED_PTR_ARRAY_FROM_DERIVED)  // [r"is private"]
     78 
     79 void WontCompile() {
     80   scoped_ptr<Parent[]> x(new Child[1]);
     81 }
     82 
     83 #elif defined(NCTEST_NO_RESET_SCOPED_PTR_ARRAY_FROM_NULL)  // [r"is ambiguous"]
     84 
     85 void WontCompile() {
     86   scoped_ptr<int[]> x;
     87   x.reset(NULL);
     88 }
     89 
     90 #elif defined(NCTEST_NO_RESET_SCOPED_PTR_ARRAY_FROM_DERIVED)  // [r"is private"]
     91 
     92 void WontCompile() {
     93   scoped_ptr<Parent[]> x;
     94   x.reset(new Child[1]);
     95 }
     96 
     97 #elif defined(NCTEST_NO_DELETER_REFERENCE)  // [r"fails to be a struct or class type"]
     98 
     99 struct Deleter {
    100   void operator()(int*) {}
    101 };
    102 
    103 // Current implementation doesn't support Deleter Reference types. Enabling
    104 // support would require changes to the behavior of the constructors to match
    105 // including the use of SFINAE to discard the type-converting constructor
    106 // as per C++11 20.7.1.2.1.19.
    107 void WontCompile() {
    108   Deleter d;
    109   int n;
    110   scoped_ptr<int*, Deleter&> a(&n, d);
    111 }
    112 
    113 #endif
    114