I made this example after noting that I was unable to display an unsized

static class array. It turns out that gcc 4.2 will emit DWARF that correctly
describes the PointType, but it will incorrectly emit debug info for the
"g_points" array where the following things are wrong:
 - the DW_TAG_array_type won't have a subrange info
 - the DW_TAG_variable for "g_points" won't have a valid byte size, so even
   though we know the size of PointType, we can't infer the actual size
   of the array by dividing the size of the variable by the number of
   elements.

We want to make sure clang and llvm-gcc handle this correctly.

llvm-svn: 113730
This commit is contained in:
Greg Clayton 2010-09-13 00:50:27 +00:00
parent 83ff3898f7
commit ac32b4ddc0
2 changed files with 49 additions and 0 deletions

View File

@ -0,0 +1,5 @@
LEVEL = ../make
CXX_SOURCES := main.cpp
include $(LEVEL)/Makefile.rules

View File

@ -0,0 +1,44 @@
//===-- main.cpp ------------------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// I made this example after noting that I was unable to display an unsized
// static class array. It turns out that gcc 4.2 will emit DWARF that correctly
// describes the PointType, but it will incorrectly emit debug info for the
// "g_points" array where the following things are wrong:
// - the DW_TAG_array_type won't have a subrange info
// - the DW_TAG_variable for "g_points" won't have a valid byte size, so even
// though we know the size of PointType, we can't infer the actual size
// of the array by dividing the size of the variable by the number of
// elements.
#include <stdio.h>
typedef struct PointType
{
int x, y;
} PointType;
class A
{
public:
static PointType g_points[];
};
PointType A::g_points[] =
{
{ 1, 2 },
{ 11, 22 }
};
int
main ()
{
printf ("A::g_points[2].x = %i\n", A::g_points[2].x);
return 0;
}