Forum: PC-Programmierung GCC-5 C++14: Ist das ein Bug?


von Daniel A. (daniel-a)


Lesenswert?

Ich wollte mal etwas mit c++14 experimentieren und bin mir nicht sicher 
ob ich einen Bug in gcc-5 gefunden habe, oder mein Code irgendeine C++ 
Regel verletzt.

GCC Version:
1
gcc (Ubuntu 5-20150328-0ubuntu11) 5.0.0 20150328 (experimental) [trunk revision 221753]
2
Copyright (C) 2015 Free Software Foundation, Inc.
3
This is free software; see the source for copying conditions.  There is NO
4
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Den GCC hab ich von hier:
https://launchpad.net/~ubuntu-toolchain-r/+archive/ubuntu/test

Mein Code:
1
#include <iostream>
2
3
template<typename T,std::size_t S>
4
struct arr {
5
  typedef T Type;
6
  Type data[S];
7
  static constexpr std::size_t size(){
8
    return S;
9
  }
10
};
11
12
constexpr auto y(){
13
  auto a = arr<char,'Z'-'A'+2>();
14
  for(std::size_t i=0;i<a.size();i++)
15
    a.data[i] = 'A'+i;
16
  a.data[a.size()-1] = 0;
17
  return a;
18
}

Meine nicht funktionierende main:
1
auto r = y();
2
// oder: const auto r = y();
3
// oder: constexpr auto r = y();
4
// oder: const constexpr auto r = y();
5
6
int main(){
7
  // Ergibt nur eine Leerzeile als Ausgabe, erwarte Buchstaben A bis Z
8
  std::cout << r.data << std::endl;
9
  return 0;
10
}

Meine zweite nicht funktionierende main:
1
int main(){
2
  auto r = y().data;
3
  std::cout << r << std::endl; // Gibt das zeiche '@' aus
4
  return 0;
5
}

Meine funktionierende main:
1
int main(){
2
  auto r = y();
3
  // gibt "ABCDEFGHIJKLMNOPQRSTUVWXYZ" aus
4
  std::cout << r.date << std::endl; 
5
  return 0;
6
}

Meine zweite funktionierende main:
1
int main(){
2
  auto r = y();
3
  // gibt "ABCDEFGHIJKLMNOPQRSTUVWXYZ" aus
4
  std::cout << y().date << std::endl; 
5
  return 0;
6
}

Mache ich irgendetwas falsch, oder ist das ein compilerbug?

von nocheinGast (Gast)


Lesenswert?

Hallo,
das ist ein Bug im Compiler.
Meiner kommt gar nicht so weit:
1
ich@utopic:/tmp$ /opt/gcc-5/bin/g++ -std=c++14 -Wall -Wextra -pedantic -o test test.cpp
2
test.cpp:20:12:   in constexpr expansion of »y()«
3
test.cpp:20:12: interner Compiler-Fehler: in cxx_eval_constant_expression, bei cp/constexpr.c:2912
4
 auto r = y();
5
            ^
6
0x7dc58e cxx_eval_constant_expression
7
  ../../source/gcc/cp/constexpr.c:2912
8
...
Aber ein aktueller aus dem SVN gebauter clang machts fehlerfrei.

von Oliver S. (oliverso)


Lesenswert?

Daniel A. schrieb:
> GCC Version:gcc (Ubuntu 5-20150328-0ubuntu11) 5.0.0 20150328
> (experimental) [trunk revision 221753]
>...
> Mache ich irgendetwas falsch, oder ist das ein compilerbug?

Nun, warum wohl steht in der gcc-Version was von "experimental"?

Oliver

von Rolf M. (rmagnus)


Lesenswert?

Daniel A. schrieb:
> Meine zweite nicht funktionierende main:int main(){
>   auto r = y().data;
>   std::cout << r << std::endl; // Gibt das zeiche '@' aus
>   return 0;
> }

Auch wenn ich c++14 nicht genau kenne (und mich gerade erst in c++11 
einarbeite): r dürfte doch ein Zeiger auf das erste Element des Arrays 
im von y zurückgegebenen Objekt sein, das aber in der nächsten Zeile 
nicht mehr existiert.

Oliver S. schrieb:
>> Mache ich irgendetwas falsch, oder ist das ein compilerbug?
>
> Nun, warum wohl steht in der gcc-Version was von "experimental"?

Ähm, weil es gut sein kann, dass es am Compiler liegt, wenn was nicht 
funktioniert? Gerade deshalb kam ja wohl die Frage.

: Bearbeitet durch User
von Benjamin (Gast)


Lesenswert?

Oliver S. schrieb:
> Nun, warum wohl steht in der gcc-Version was von "experimental"?

Das bedeutet zunächst, dass der Compiler noch nicht ausreichend getestet 
wurde und anzunehmen ist, dass einiges noch nicht ganz rund läuft.

Dennoch ist die Frage
Rolf Magnus schrieb:
> Mache ich irgendetwas falsch, oder ist das ein compilerbug?

berechtigt,
weil "experimental" nicht beduetet, dass automatisch alles was seltsam 
läuft automatisch ein Compilerbug ist.

Wolltest wieder bisl rumrotzen?

von Rolf Magnus (Gast)


Lesenswert?

Benjamin schrieb:
> Dennoch ist die Frage
> Rolf Magnus schrieb:
>> Mache ich irgendetwas falsch, oder ist das ein compilerbug?
>
> berechtigt,

Das mit dem Zitieren üben wir nochmal. Von mir kommt diese Frage nicht.

von Daniel A. (daniel-a)


Lesenswert?

Rolf Magnus schrieb:
> r dürfte doch ein Zeiger auf das erste Element des Arrays
> im von y zurückgegebenen Objekt sein, das aber in der nächsten Zeile
> nicht mehr existiert.

Also ist die zweite nicht funktionierende main mein Fehler.
Jetzt bleibt noch die erste main, villeicht ist es ja etwas änliches.

Danke für die Hilfe, langsam klärt sich das rätsel auf.

von Oliver S. (oliverso)


Lesenswert?

Nun ja, die beiden "funktionierenden" mains compilieren gar nicht 
erst...

Rolf Magnus schrieb:
> r dürfte doch ein Zeiger auf das erste Element des Arrays
> im von y zurückgegebenen Objekt sein, das aber in der nächsten Zeile
> nicht mehr existiert.

Damit wären alle vier Versionen gleich falsch.

Oliver

von Vlad T. (vlad_tepesch)


Lesenswert?

Daniel A. schrieb:
> Also ist die zweite nicht funktionierende main mein Fehler.

theoretisch auch die 2. funktionierende main.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Daniel A. schrieb:
> Mache ich irgendetwas falsch, oder ist das ein compilerbug?

D.h. man muss ".date" schreiben, um auf ".data" zugreifen zu können???

von nocheinGast (Gast)


Lesenswert?

Ich hab tatsächlich nur die erste angeschaut. Und die ist korrekt, 
kompiliert aber momentan nicht.
Nur die zweite ist aber tatsächlich falsch.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Alle Versionen mit Ausnahme der zweiten sind richtig und kompilieren 
einwandfrei mit clang. Die falsche kompiliert zwar auch, aber mit 
Warnung:
1
int main(){
2
  auto r = y().data; // clang warning: "pointer is initialized by a temporary array, which will be destroyed at the end of the full-expression"
3
  std::cout << r << std::endl; // Gibt das zeiche '@' aus
4
  return 0;
5
}

: Bearbeitet durch Admin
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.