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 // This is a "No Compile Test" suite.
      6 // http://dev.chromium.org/developers/testing/no-compile-tests
      7 
      8 #include "base/memory/scoped_ptr.h"
      9 
     10 #include <utility>
     11 
     12 #include "base/macros.h"
     13 #include "base/memory/ref_counted.h"
     14 
     15 namespace {
     16 
     17 class Parent {
     18 };
     19 
     20 class Child : public Parent {
     21 };
     22 
     23 class RefCountedClass : public base::RefCountedThreadSafe<RefCountedClass> {
     24 };
     25 
     26 }  // namespace
     27 
     28 #if defined(NCTEST_NO_PASS_DOWNCAST)  // [r"fatal error: no viable conversion from returned value of type 'scoped_ptr<\(anonymous namespace\)::Parent>' to function return type 'scoped_ptr<\(anonymous namespace\)::Child>'"]
     29 
     30 scoped_ptr<Child> DowncastUsingPassAs(scoped_ptr<Parent> object) {
     31   return object;
     32 }
     33 
     34 #elif defined(NCTEST_NO_REF_COUNTED_SCOPED_PTR)  // [r"fatal error: static_assert failed \"T is a refcounted type and needs a scoped_refptr\""]
     35 
     36 // scoped_ptr<> should not work for ref-counted objects.
     37 void WontCompile() {
     38   scoped_ptr<RefCountedClass> x;
     39 }
     40 
     41 #elif defined(NCTEST_NO_ARRAY_WITH_SIZE)  // [r"fatal error: static_assert failed \"scoped_ptr doesn't support array with size\""]
     42 
     43 void WontCompile() {
     44   scoped_ptr<int[10]> x;
     45 }
     46 
     47 #elif defined(NCTEST_NO_PASS_FROM_ARRAY)  // [r"fatal error: no viable overloaded '='"]
     48 
     49 void WontCompile() {
     50   scoped_ptr<int[]> a;
     51   scoped_ptr<int*> b;
     52   b = std::move(a);
     53 }
     54 
     55 #elif defined(NCTEST_NO_PASS_TO_ARRAY)  // [r"fatal error: no viable overloaded '='"]
     56 
     57 void WontCompile() {
     58   scoped_ptr<int*> a;
     59   scoped_ptr<int[]> b;
     60   b = std::move(a);
     61 }
     62 
     63 #elif defined(NCTEST_NO_CONSTRUCT_FROM_ARRAY)  // [r"fatal error: no matching constructor for initialization of 'scoped_ptr<int \*>'"]
     64 
     65 void WontCompile() {
     66   scoped_ptr<int[]> a;
     67   scoped_ptr<int*> b(std::move(a));
     68 }
     69 
     70 #elif defined(NCTEST_NO_CONSTRUCT_TO_ARRAY)  // [r"fatal error: no matching constructor for initialization of 'scoped_ptr<int \[\]>'"]
     71 
     72 void WontCompile() {
     73   scoped_ptr<int*> a;
     74   scoped_ptr<int[]> b(std::move(a));
     75 }
     76 
     77 #elif defined(NCTEST_NO_CONSTRUCT_SCOPED_PTR_ARRAY_FROM_NULL)  // [r"is ambiguous"]
     78 
     79 void WontCompile() {
     80   scoped_ptr<int[]> x(NULL);
     81 }
     82 
     83 #elif defined(NCTEST_NO_CONSTRUCT_SCOPED_PTR_ARRAY_FROM_DERIVED)  // [r"fatal error: calling a private constructor of class 'scoped_ptr<\(anonymous namespace\)::Parent \[\], std::default_delete<\(anonymous namespace\)::Parent \[\]> >'"]
     84 
     85 void WontCompile() {
     86   scoped_ptr<Parent[]> x(new Child[1]);
     87 }
     88 
     89 #elif defined(NCTEST_NO_RESET_SCOPED_PTR_ARRAY_FROM_NULL)  // [r"is ambiguous"]
     90 
     91 void WontCompile() {
     92   scoped_ptr<int[]> x;
     93   x.reset(NULL);
     94 }
     95 
     96 #elif defined(NCTEST_NO_RESET_SCOPED_PTR_ARRAY_FROM_DERIVED)  // [r"fatal error: 'reset' is a private member of 'scoped_ptr<\(anonymous namespace\)::Parent \[\], std::default_delete<\(anonymous namespace\)::Parent \[\]> >'"]
     97 
     98 void WontCompile() {
     99   scoped_ptr<Parent[]> x;
    100   x.reset(new Child[1]);
    101 }
    102 
    103 #elif defined(NCTEST_NO_DELETER_REFERENCE)  // [r"fatal error: base specifier must name a class"]
    104 
    105 struct Deleter {
    106   void operator()(int*) {}
    107 };
    108 
    109 // Current implementation doesn't support Deleter Reference types. Enabling
    110 // support would require changes to the behavior of the constructors to match
    111 // including the use of SFINAE to discard the type-converting constructor
    112 // as per C++11 20.7.1.2.1.19.
    113 void WontCompile() {
    114   Deleter d;
    115   int n;
    116   scoped_ptr<int*, Deleter&> a(&n, d);
    117 }
    118 
    119 #endif
    120