mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-22 13:05:52 -04:00

We were checking for integer types only before this. So I added the ability for CompilerType objects to check for integer and enum types. Then I searched for places that were using the CompilerType::IsIntegerType(...) function. Many of these places also wanted to be checking for enumeration types as well, so I have fixed those places. These are in the ABI plug-ins where we are figuring out which arguments would go in where in regisers/stack when making a function call, or determining where the return value would live. The real fix for this is to use clang to compiler a CGFunctionInfo and then modify the code to be able to take the IR and a calling convention and have the backend answer the questions correctly for us so we don't need to create a really bad copy of the ABI in each plug-in, but that is beyond the scope of this bug fix. Also added a test case to ensure this doesn't regress in the future. llvm-svn: 273750
73 lines
1.8 KiB
C++
73 lines
1.8 KiB
C++
//===-- main.cpp ------------------------------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
template <int Arg>
|
|
class TestObj
|
|
{
|
|
public:
|
|
int getArg()
|
|
{
|
|
return Arg;
|
|
}
|
|
};
|
|
|
|
//----------------------------------------------------------------------
|
|
// Define a template class that we can specialize with an enumeration
|
|
//----------------------------------------------------------------------
|
|
enum class EnumType
|
|
{
|
|
Member,
|
|
Subclass
|
|
};
|
|
|
|
template <EnumType Arg> class EnumTemplate;
|
|
|
|
//----------------------------------------------------------------------
|
|
// Specialization for use when "Arg" is "EnumType::Member"
|
|
//----------------------------------------------------------------------
|
|
template <>
|
|
class EnumTemplate<EnumType::Member>
|
|
{
|
|
public:
|
|
EnumTemplate(int m) :
|
|
m_member(m)
|
|
{
|
|
}
|
|
|
|
int getMember() const
|
|
{
|
|
return m_member;
|
|
}
|
|
|
|
protected:
|
|
int m_member;
|
|
};
|
|
|
|
//----------------------------------------------------------------------
|
|
// Specialization for use when "Arg" is "EnumType::Subclass"
|
|
//----------------------------------------------------------------------
|
|
template <>
|
|
class EnumTemplate<EnumType::Subclass> :
|
|
public EnumTemplate<EnumType::Member>
|
|
{
|
|
public:
|
|
EnumTemplate(int m) : EnumTemplate<EnumType::Member>(m)
|
|
{
|
|
}
|
|
};
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
TestObj<1> testpos;
|
|
TestObj<-1> testneg;
|
|
EnumTemplate<EnumType::Member> member(123);
|
|
EnumTemplate<EnumType::Subclass> subclass(123*2);
|
|
return testpos.getArg() - testneg.getArg() + member.getMember()*2 - subclass.getMember(); // Breakpoint 1
|
|
}
|