2016-09-13 15 views
8

Poniższy kod poprawnie kompiluje się na clang 3.8.1-1 w ArchLinux.Szablon funkcji modyfikuje parametr zadeklarowany za pomocą const najwyższego poziomu: błąd klang?

Czy to błąd clang?

gcc wydają poprawne ostrzeżenie/błąd w tej sprawie.

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; 
} 

Oto jak skompilować:

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

clang i c++14 - ten sam rezultat.

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

Oto wyjściowe gcc:

[[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

Wykonaj wyszukiwanie w Google dla "raportu o błędzie". Nie rozumiem przegranych. Prośba o wskazówki do zasobów zewnętrznych jest tutaj wyraźnie wyłączona. –

+0

Będę edytować i usunie żądanie. Ale czy to błąd? – Nick

+0

Nie widzę powodu, dla którego to nie jest błąd - ale dlaczego nie złożyć raportu, i zobaczyć, co mówi trik klang? –

Odpowiedz

5

Tak, to jest to błąd w brzękiem; złożony pod numerem https://llvm.org/bugs/show_bug.cgi?id=30365.

Charakter błędu polega na tym, że w definicji elementu szablonu klasy pojawiającej się poza ([class.mfct]/1) szablon klasy, z typem parametru zależnym od parametrów szablonu klasy, używa clang typ parametru deklaracji, a nie typ parametru definicji, w którym różnią się najwyższymi kwalifikacjami cv. Uproszczony przykład:

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); } 

za [dcl.fct]/5 typu i w definicji A<X>::f jest int const (Use of 'const' for function parameters)

5 - [...] Po wytworzeniu lista typów parametrów, dowolne kwalifikatory cc najwyższego poziomu modyfikujące typ parametru, są usuwane podczas tworzenia typu funkcji. [...] Uwaga: Ta transformacja nie ma wpływu na typy parametrów. [...] - końcowa notatka]

+0

dzięki. zgłosiłeś to? Wciąż czekam na konto błędów. – Nick

+0

Tak, zgłoszę to - dodał powyższy link. – ecatmur

+0

dzięki. Nie mogłem również zminimalizować kodu tak jak ty. – Nick