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

OP #4072133
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?
Gast #4072161
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.
#4072447
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.
Gast #4072482
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?
Admin Persönliche Seite #4073908
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
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.