blob: f5857d2928de57c297783d7fd8c68548b2a990e9 [file] [log] [blame]
/* Verify that the inliner makes good decisions and the example
is optimized to 2 printf()s in main(). */
// { dg-do compile }
// { dg-options "-O2 -fdump-tree-optimized" }
#include <stdint.h>
#include <stdio.h>
class String
{
public:
virtual uint64_t length() const = 0;
virtual char get(uint64_t index) const = 0;
virtual void set(uint64_t index, char value) = 0;
virtual char& operator[] (uint64_t value) = 0;
virtual ~String() {};
};
template<uint64_t size> class FixedString : public String
{
private:
char contents[size + 1];
public:
virtual uint64_t length() const { return size; }
virtual char get(uint64_t index) const { return contents[index]; }
virtual void set(uint64_t index, char value) { contents[index] = value; }
virtual char& operator[] (uint64_t index) { return contents[index]; }
FixedString() { contents[size] = '\0'; }
};
void print_length (const String& string)
{
for (uint64_t i = 0; i < string.length(); i++)
{
printf("%d\n", string.get(i));
}
}
int main()
{
FixedString<2> empty;
empty[0] = 'a';
empty[1] = 'b';
print_length(empty);
return 0;
}
// { dg-final { scan-tree-dump "printf \\(\"%d\\\\n\", 97\\);" "optimized" { xfail *-*-* } } }
// { dg-final { scan-tree-dump "printf \\(\"%d\\\\n\", 98\\);" "optimized" { xfail *-*-* } } }
// { dg-final { cleanup-tree-dump "optimized" } }