Skip to content

Commit d2401cb

Browse files
committed
C++ front-end: Distinguish references from rvalue references
Template specialisation previously would produce the same symbol name for both template<typename T> struct S<T&> as well as template<typename T> struct S<T&&>. As Visual Studio uses both of these in system headers, any test involving includes failed on Windows.
1 parent b947f4e commit d2401cb

File tree

2 files changed

+13
-5
lines changed

2 files changed

+13
-5
lines changed

buildspec-windows.yml

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,7 @@ phases:
4747
Remove-Item cbmc\byte_update5 -Force -Recurse
4848
Remove-Item cbmc\byte_update6 -Force -Recurse
4949
Remove-Item cbmc\byte_update7 -Force -Recurse
50-
Remove-Item cpp -Force -Recurse
51-
Remove-Item cbmc-cpp -Force -Recurse
52-
Remove-Item goto-gcc -Force -Recurse
53-
Remove-Item systemc -Force -Recurse
50+
Remove-Item cpp\virtual1 -Force -Recurse
5451
cd ..
5552
cd jbmc/regression
5653
Remove-Item jbmc\VarLengthArrayTrace1 -Force -Recurse

src/cpp/cpp_type2name.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,18 @@ static void irep2name(const irept &irep, std::string &result)
3333
if(is_reference(static_cast<const typet&>(irep)))
3434
result+="reference";
3535

36-
if(irep.id()!="")
36+
if(is_rvalue_reference(static_cast<const typet &>(irep)))
37+
result += "rvalue_reference";
38+
39+
if(irep.id() == ID_frontend_pointer)
40+
{
41+
if(irep.get_bool(ID_C_reference))
42+
result += "reference";
43+
44+
if(irep.get_bool(ID_C_rvalue_reference))
45+
result += "rvalue_reference";
46+
}
47+
else if(!irep.id().empty())
3748
result+=do_prefix(irep.id_string());
3849

3950
if(irep.get_named_sub().empty() && irep.get_sub().empty())

0 commit comments

Comments
 (0)