2016-09-13 61 views
8

Aşağıdaki kod ArchLinux üzerinde clang 3.8.1-1 üzerinde doğru derler.İşlev şablonu, üst düzey const ile bildirilen parametreyi değiştirir: clang bug?

Bu clang hatası mı? Bu konuda doğru uyarı/hata oluşuyor

gcc. İşte

template <class T> 
struct BugReproducer{ 
    using size_type = typename T::size_type; 

    int bug1(size_type count); 
    int bug2(size_type count) const; 
    static int bug3(size_type count); 
}; 

template <class T> 
int BugReproducer<T>::bug1(size_type const count){ 
    // this is a bug. must be not allowed 
    count = 5; 

    // return is to use the result... 
    return count; 
} 

template <class T> 
int BugReproducer<T>::bug2(size_type const count) const{ 
    // same for const method 
    count = 5; 
    return count; 
} 

template <class T> 
int BugReproducer<T>::bug3(size_type const count){ 
    // same for static method 
    count = 5; 
    return count; 
} 



struct DummyVector{ 
    using size_type = int; 
}; 



int main(){ 
    using BugRepr = BugReproducer<DummyVector>; 

    BugRepr reproducer; 

    auto a = reproducer.bug1(1); 
    auto b = reproducer.bug2(1); 
    auto c = BugRepr::bug3(1); 

    // return is to use the result... 
    return a + b + c; 
} 

Ben derleme nasıl:

[[email protected] HM3]$ clang x.cc -std=c++11 -lstdc++ -Wall -Wpedantic -Wconversion 

clang ve c++14 - aynı sonucu. İşte

[[email protected] HM3]$ clang x.cc -std=c++14 -lstdc++ -Wall -Wpedantic -Wconversion 

gcc çıktı şöyledir:

[[email protected] HM3]$ gcc x.cc -std=c++11 -lstdc++ -Wall -Wpedantic -Wconversion 
x.cc: In instantiation of ‘int BugReproducer<T>::bug1(BugReproducer<T>::size_type) [with T = DummyVector; BugReproducer<T>::size_type = int]’: 
x.cc:46:28: required from here 
x.cc:13:8: error: assignment of read-only parameter ‘count’ 
    count = 5; 
    ~~~~~~^~~ 
x.cc: In instantiation of ‘int BugReproducer<T>::bug2(BugReproducer<T>::size_type) const [with T = DummyVector; BugReproducer<T>::size_type = int]’: 
x.cc:47:28: required from here 
x.cc:22:8: error: assignment of read-only parameter ‘count’ 
    count = 5; 
    ~~~~~~^~~ 
x.cc: In instantiation of ‘static int BugReproducer<T>::bug3(BugReproducer<T>::size_type) [with T = DummyVector; BugReproducer<T>::size_type = int]’: 
x.cc:48:20: required from here 
x.cc:29:8: error: assignment of read-only parameter ‘count’ 
    count = 5; 
    ~~~~~~^~~ 
+10

"clang bug report" için bir Google araması yapın. Yükseltmeleri anlamıyorum. Site dışı kaynaklara yönlendirme istemek, burada açıkça konu dışıdır. –

+0

Düzenleyeceğim ve isteği kaldıracaktır. Ama bu bir hata mı? – Nick

+0

Bunun neden bir hata olmadığını göremiyorum - ama neden bir rapor dosyalamıyor ve clang triyaj'ın ne dediğini görmüyoruz? –

cevap

5

Evet, bu clang bir hata olduğu; https://llvm.org/bugs/show_bug.cgi?id=30365'da dosyalanmıştır.

böcek doğası sınıf şablon üye işlev tanımında ([class.mfct]/1) Sınıf şablonu parametrelerine bağlı olarak bir parametrenin tip sınıfı şablonu, tınlamak kullanımları dışında görünen olmasıdır En üst cv-kalifikasyonunda farklılık gösterdikleri tanımın parametre tipinden ziyade, beyanın parametre tipi. Basitleştirilmiş örnek: başına

template<class T> struct A { void f(typename T::U); }; 
template<class T> void A<T>::f(typename T::U const i) { i = 1; } 
struct X { using U = int; }; 
int main() { A<X>{}.f(0); } 

[dcl.fct]/5 A<X>::f tanımı içindeki i tipi int const (Use of 'const' for function parameters) 'dir:

5 - [...] üretilmesine sonra Parametre türlerinin listesi, tipinde bir parametre değiştiren herhangi bir üst düzey cv-niteleyiciler işlev tipi oluşturulurken silinir. [...] [Not: Bu dönüşüm, parametrelerin türlerini etkilemez. [...] - notu]

+0

teşekkürlerinden bahsetmek için başlığı düzenlemenizi önerir. rapor ettin mi Hala böcek hesabını bekliyorum. – Nick

+0

Evet, bildirdim - yukarıdaki bağlantıyı ekledim. – ecatmur

+0

teşekkürler. Kodu da yaptığınız gibi en aza indirgemedim. – Nick