2014-01-07 14:57:02 +04:00
//------------------------------------------------------------------------------
// CLING - the C++ LLVM-based InterpreterG :)
//
// This file is dual-licensed: you can choose to license it under the University
// of Illinois Open Source License or the GNU Lesser General Public License. See
// LICENSE.TXT for details.
//------------------------------------------------------------------------------
2012-10-10 17:00:17 +04:00
// RUN: cat %s | %cling | FileCheck %s
2012-09-05 13:37:39 +04:00
// The test verifies the expected behavior in cling::utils::Transform class,
// which is supposed to provide different transformation of AST nodes and types.
# include "cling/Interpreter/Interpreter.h"
# include "cling/Interpreter/LookupHelper.h"
# include "cling/Utils/AST.h"
# include "clang/AST/Type.h"
2012-10-26 23:51:56 +04:00
# include "clang/AST/ASTContext.h"
2012-09-05 13:37:39 +04:00
# include "llvm/ADT/SmallSet.h"
2012-10-03 16:57:48 +04:00
# include "clang/Sema/Sema.h"
2012-09-05 13:37:39 +04:00
. rawInput 1
2012-12-11 12:26:00 +04:00
# include <vector>
# include <iostream>
2012-09-05 13:37:39 +04:00
typedef double Double32_t ;
typedef int Int_t ;
typedef long Long_t ;
typedef Int_t * IntPtr_t ;
2012-10-19 17:33:38 +04:00
typedef Int_t & IntRef_t ;
2012-09-05 13:37:39 +04:00
template < typename T > class A { } ;
template < typename T , typename U > class B { } ;
template < typename T , typename U > class C { } ;
typedef C < A < B < Double32_t , Int_t > > , Double32_t > CTD ;
typedef C < A < B < const Double32_t , const Int_t > > , Double32_t > CTDConst ;
2014-03-21 03:27:54 +04:00
template < typename key , typename value , typename compare_operation = std : : less < key > , typename alloc = std : : allocator < std : : pair < const key , value > > > class cmap { key fKey ; const value fValue ; alloc fAlloc ; public : cmap ( ) : fValue ( 0 ) { } } ;
2013-02-12 22:38:58 +04:00
// : public std::map<key, value, compare_operation, alloc> {
template < typename key , typename value = const key > class mypair { public : key fKey ; value fValue ; } ;
2012-09-27 12:49:18 +04:00
# include <string>
namespace Details {
2012-12-11 12:26:00 +04:00
class Impl { } ;
2012-09-27 12:49:18 +04:00
}
2013-02-08 02:56:10 +04:00
// To insure instantiation.
// typedef std::pair<Details::Impl,std::vector<Details::Impl> > details_pairs;
2012-09-27 12:49:18 +04:00
namespace NS {
2012-12-11 12:26:00 +04:00
template < typename T , int size = 0 > class ArrayType { } ;
template < typename T > class Array { } ;
template < typename T > class Container {
public :
class Content { } ;
typedef T Value_t ;
typedef Content Content_t ;
typedef : : Details : : Impl Impl_t ;
} ;
2013-10-30 16:23:58 +04:00
2012-12-11 12:26:00 +04:00
template < typename T > class TDataPoint { } ;
typedef TDataPoint < float > TDataPointF ;
typedef TDataPoint < Double32_t > TDataPointD32 ;
2013-10-30 16:23:58 +04:00
const int typeN = 1 ;
typedef ArrayType < float , typeN + 1 > FArray ;
2013-11-06 20:04:33 +04:00
typedef int IntNS_t ;
2014-03-21 18:48:31 +04:00
2012-09-27 12:49:18 +04:00
}
2012-10-26 23:51:56 +04:00
// Anonymous namespace
namespace {
2012-12-11 12:26:00 +04:00
class InsideAnonymous {
} ;
2012-10-26 23:51:56 +04:00
}
2013-03-01 23:05:54 +04:00
using namespace std ;
2012-12-11 12:26:00 +04:00
class Embedded_objects {
public :
2012-12-11 14:41:56 +04:00
enum Eenum {
kEnumConst = 16
} ;
2012-12-11 12:26:00 +04:00
class EmbeddedClasses ;
typedef EmbeddedClasses EmbeddedTypedef ;
class EmbeddedClasses {
public :
class Embedded1 { } ;
class Embedded2 { } ;
class Embedded3 { } ;
class Embedded4 { } ;
class Embedded5 { } ;
class Embedded6 { } ;
} ;
EmbeddedClasses m_embedded ;
EmbeddedClasses : : Embedded1 m_emb1 ;
EmbeddedClasses : : Embedded2 m_emb2 ;
EmbeddedClasses : : Embedded3 m_emb3 ;
EmbeddedTypedef : : Embedded4 m_emb4 ;
Embedded_objects : : EmbeddedClasses : : Embedded5 m_emb5 ;
Embedded_objects : : EmbeddedTypedef : : Embedded6 m_emb6 ;
2014-03-21 18:48:31 +04:00
2012-12-11 12:26:00 +04:00
typedef std : : vector < int > vecint ;
2014-03-21 03:27:54 +04:00
vecint * m_iter ;
2012-12-11 14:41:56 +04:00
const Eenum m_enum ;
2013-03-01 23:05:54 +04:00
typedef vector < int > vecint2 ;
2014-03-21 03:27:54 +04:00
vecint2 * m_iter2 ;
2014-03-21 18:48:31 +04:00
vector < Double32_t > vd32a ;
typedef vector < Double32_t > vecd32t1 ;
vecd32t1 vd32b ;
using vecd32t2 = vector < Double32_t > ;
vecd32t2 vd32c ;
template < typename T > using myvector = std : : vector < T > ;
myvector < float > vfa ;
// Not yet, the desugar of template alias do not keep the opaque typedef.
// myvector<Double32_t> vd32d;
Double32_t * p1 ;
template < class T > using ptr = T * ;
ptr < float > p2 ;
// Not yet, the desugar of template alias do not keep the opaque typedef.
// ptr<Double32_t> p3;
2014-05-14 06:01:01 +04:00
typedef B < Int_t , Double32_t > t1 ;
typedef t1 * t2 ;
typedef t2 * t3 ;
typedef t3 t4 [ 3 ] ;
typedef t4 t5 [ 4 ] ;
typedef t5 & t6 ;
typedef t1 & t7 ;
typedef t2 & t8 ;
typedef t2 t9 ;
typedef t5 * t10 ;
t1 d1 ;
t2 d2 ;
t2 d2_1 [ 5 ] ;
t3 d3 ;
t4 d4 ;
t5 d5 ;
t6 d6 ;
t7 d7 ;
t8 d8 ;
t9 d9 ;
t10 d10 ;
2012-12-11 12:26:00 +04:00
} ;
2013-03-01 23:05:54 +04:00
namespace NS1 {
namespace NS2 {
namespace NS3 {
2014-03-21 18:48:31 +04:00
inline namespace InlinedNamespace {
class InsideInline { } ;
}
2013-03-01 23:05:54 +04:00
class Point { } ;
class Inner3 {
public :
Point p1 ;
NS3 : : Point p2 ;
: : NS1 : : NS2 : : NS3 : : Point p3 ;
2014-03-21 18:48:31 +04:00
InsideInline p4 ;
2013-03-01 23:05:54 +04:00
} ;
}
}
}
2012-09-05 13:37:39 +04:00
. rawInput 0
const cling : : LookupHelper & lookup = gCling - > getLookupHelper ( ) ;
2014-02-19 15:54:31 +04:00
cling : : LookupHelper : : DiagSetting diags = cling : : LookupHelper : : WithDiagnostics ;
2012-10-03 16:57:48 +04:00
const clang : : ASTContext & Ctx = gCling - > getSema ( ) . getASTContext ( ) ;
2013-09-03 16:27:29 +04:00
cling : : utils : : Transform : : Config transConfig ;
2013-01-06 21:06:31 +04:00
2014-02-19 15:54:31 +04:00
transConfig . m_toSkip . insert ( lookup . findType ( " Double32_t " , diags ) . getTypePtr ( ) ) ;
2013-01-06 21:06:31 +04:00
using namespace std ;
2014-02-19 15:54:31 +04:00
transConfig . m_toSkip . insert ( lookup . findType ( " string " , diags ) . getTypePtr ( ) ) ;
transConfig . m_toSkip . insert ( lookup . findType ( " std::string " , diags ) . getTypePtr ( ) ) ;
2013-01-06 21:06:31 +04:00
2012-09-05 13:37:39 +04:00
const clang : : Type * t = 0 ;
clang : : QualType QT ;
using namespace cling : : utils ;
2012-10-26 23:51:56 +04:00
// Test the behavior on a simple class
2014-02-19 15:54:31 +04:00
lookup . findScope ( " Details::Impl " , diags , & t ) ;
2012-10-26 23:51:56 +04:00
QT = clang : : QualType ( t , 0 ) ;
//QT.getAsString().c_str()
2013-09-03 16:27:29 +04:00
Transform : : GetPartiallyDesugaredType ( Ctx , QT , transConfig ) . getAsString ( ) . c_str ( )
2014-03-31 17:09:55 +04:00
// CHECK: ({{[^)]+}}) "Details::Impl"
2012-10-26 23:51:56 +04:00
// Test the behavior for a class inside an anonymous namespace
2014-02-19 15:54:31 +04:00
lookup . findScope ( " InsideAnonymous " , diags , & t ) ;
2012-10-26 23:51:56 +04:00
QT = clang : : QualType ( t , 0 ) ;
//QT.getAsString().c_str()c
2013-09-03 16:27:29 +04:00
Transform : : GetPartiallyDesugaredType ( Ctx , QT , transConfig ) . getAsString ( ) . c_str ( )
2014-03-31 17:09:55 +04:00
// CHECK: ({{[^)]+}}) "class <anonymous namespace>::InsideAnonymous"
2012-10-26 23:51:56 +04:00
// The above result is not quite want we want, so the client must using
// the following:
// The scope suppression is required for getting rid of the anonymous part of the name of a class defined in an anonymous namespace.
// This gives us more control vs not using the clang::ElaboratedType and relying on the Policy.SuppressUnwrittenScope which would
// strip both the anonymous and the inline namespace names (and we probably do not want the later to be suppressed).
clang : : PrintingPolicy Policy ( Ctx . getPrintingPolicy ( ) ) ;
Policy . SuppressTagKeyword = true ; // Never get the class or struct keyword
Policy . SuppressScope = true ; // Force the scope to be coming from a clang::ElaboratedType.
std : : string name ;
2013-09-03 16:27:29 +04:00
Transform : : GetPartiallyDesugaredType ( Ctx , QT , transConfig ) . getAsStringInternal ( name , Policy ) ;
2012-10-26 23:51:56 +04:00
name . c_str ( )
2014-03-31 17:09:55 +04:00
// CHECK: ({{[^)]+}}) "InsideAnonymous"
2012-10-26 23:51:56 +04:00
2012-09-05 13:37:39 +04:00
// Test desugaring pointers types:
2014-02-19 15:54:31 +04:00
QT = lookup . findType ( " Int_t* " , diags ) ;
2013-09-03 16:27:29 +04:00
Transform : : GetPartiallyDesugaredType ( Ctx , QT , transConfig ) . getAsString ( ) . c_str ( )
2014-03-31 17:09:55 +04:00
// CHECK:({{[^)]+}}) "int *"
2012-09-05 13:37:39 +04:00
2014-02-19 15:54:31 +04:00
QT = lookup . findType ( " const IntPtr_t* " , diags ) ;
2013-09-03 16:27:29 +04:00
Transform : : GetPartiallyDesugaredType ( Ctx , QT , transConfig ) . getAsString ( ) . c_str ( )
2014-03-31 17:09:55 +04:00
// CHECK:({{[^)]+}}) "int *const *"
2012-09-05 13:37:39 +04:00
// Test desugaring reference (both r- or l- value) types:
2014-02-19 15:54:31 +04:00
QT = lookup . findType ( " const IntPtr_t& " , diags ) ;
2013-09-03 16:27:29 +04:00
Transform : : GetPartiallyDesugaredType ( Ctx , QT , transConfig ) . getAsString ( ) . c_str ( )
2014-03-31 17:09:55 +04:00
// CHECK:({{[^)]+}}) "int *const &"
2012-09-05 13:37:39 +04:00
2014-02-19 15:54:31 +04:00
//TODO: QT = lookup.findType("IntPtr_t[32], diags");
2012-09-05 13:37:39 +04:00
2012-10-19 17:33:38 +04:00
// To do: findType does not return the const below:
// Test desugaring reference (both r- or l- value) types:
2014-02-19 15:54:31 +04:00
// QT = lookup.findType("const IntRef_t", diags);
2013-11-07 00:33:57 +04:00
// Transform::GetPartiallyDesugaredType(Ctx, QT, transConfig).getAsString().c_str()
2014-03-31 17:09:55 +04:00
// should print:({{[^)]+}}) "int &const"
2013-11-07 00:33:57 +04:00
// but this is actually an illegal type:
// C++ [dcl.ref]p1:
// Cv-qualified references are ill-formed except when the
// cv-qualifiers are introduced through the use of a typedef
// (7.1.3) or of a template type argument (14.3), in which
// case the cv-qualifiers are ignored.
// So the following is the right behavior:
2014-03-31 17:09:55 +04:00
// Will issue
// "'const' qualifier on reference type 'IntRef_t' (aka 'int &') has no effect"
// thus suppress diagnostics
QT = lookup . findType ( " const IntRef_t " , cling : : LookupHelper : : NoDiagnostics ) ;
2013-11-07 00:33:57 +04:00
Transform : : GetPartiallyDesugaredType ( Ctx , QT , transConfig ) . getAsString ( ) . c_str ( )
2014-03-31 17:09:55 +04:00
// CHECK: ({{[^)]+}}) "int &"
2012-10-19 17:33:38 +04:00
// Test desugaring reference (both r- or l- value) types:
2014-02-19 15:54:31 +04:00
QT = lookup . findType ( " IntRef_t " , diags ) ;
2013-09-03 16:27:29 +04:00
Transform : : GetPartiallyDesugaredType ( Ctx , QT , transConfig ) . getAsString ( ) . c_str ( )
2014-03-31 17:09:55 +04:00
// CHECK:({{[^)]+}}) "int &"
2012-10-19 17:33:38 +04:00
2012-09-05 13:37:39 +04:00
//Desugar template parameters:
2014-02-19 15:54:31 +04:00
lookup . findScope ( " A<B<Double32_t, Int_t*> > " , diags , & t ) ;
2012-09-05 13:37:39 +04:00
QT = clang : : QualType ( t , 0 ) ;
2013-09-03 16:27:29 +04:00
Transform : : GetPartiallyDesugaredType ( Ctx , QT , transConfig ) . getAsString ( ) . c_str ( )
2014-03-31 17:09:55 +04:00
// CHECK:({{[^)]+}}) "A<B<Double32_t, int *> >"
2012-09-05 13:37:39 +04:00
2014-02-19 15:54:31 +04:00
lookup . findScope ( " A<B<Double32_t, std::size_t*> > " , diags , & t ) ;
2013-02-14 21:45:49 +04:00
QT = clang : : QualType ( t , 0 ) ;
2013-09-03 16:27:29 +04:00
Transform : : GetPartiallyDesugaredType ( Ctx , QT , transConfig ) . getAsString ( ) . c_str ( )
2014-03-31 17:09:55 +04:00
// CHECK:({{[^)]+}}) "A<B<Double32_t, unsigned {{long|int}} *> >"
2013-02-14 21:45:49 +04:00
2014-02-19 15:54:31 +04:00
lookup . findScope ( " CTD " , diags , & t ) ;
2012-09-05 13:37:39 +04:00
QT = clang : : QualType ( t , 0 ) ;
2013-09-03 16:27:29 +04:00
Transform : : GetPartiallyDesugaredType ( Ctx , QT , transConfig ) . getAsString ( ) . c_str ( )
2014-03-31 17:09:55 +04:00
// CHECK: ({{[^)]+}}) "C<A<B<Double32_t, int> >, Double32_t>"
2012-09-05 13:37:39 +04:00
2014-02-19 15:54:31 +04:00
lookup . findScope ( " CTDConst " , diags , & t ) ;
2012-09-05 13:37:39 +04:00
QT = clang : : QualType ( t , 0 ) ;
2013-09-03 16:27:29 +04:00
Transform : : GetPartiallyDesugaredType ( Ctx , QT , transConfig ) . getAsString ( ) . c_str ( )
2014-03-31 17:09:55 +04:00
// CHECK: ({{[^)]+}}) "C<A<B<const Double32_t, const int> >, Double32_t>"
2012-09-27 12:49:18 +04:00
2014-02-19 15:54:31 +04:00
lookup . findScope ( " std::pair<const std::string,int> " , diags , & t ) ;
2012-09-27 12:49:18 +04:00
QT = clang : : QualType ( t , 0 ) ;
2013-09-03 16:27:29 +04:00
Transform : : GetPartiallyDesugaredType ( Ctx , QT , transConfig ) . getAsString ( ) . c_str ( )
2014-03-31 17:09:55 +04:00
// CHECK: ({{[^)]+}}) "std::pair<const std::string, int>"
2012-09-27 12:49:18 +04:00
2014-02-19 15:54:31 +04:00
lookup . findScope ( " NS::Array<NS::ArrayType<double> > " , diags , & t ) ;
2012-09-27 12:49:18 +04:00
QT = clang : : QualType ( t , 0 ) ;
2013-09-03 16:27:29 +04:00
Transform : : GetPartiallyDesugaredType ( Ctx , QT , transConfig ) . getAsString ( ) . c_str ( )
2014-03-31 17:09:55 +04:00
// CHECK: ({{[^)]+}}) "NS::Array<NS::ArrayType<double> >"
2012-09-27 12:49:18 +04:00
2014-02-19 15:54:31 +04:00
lookup . findScope ( " NS::Array<NS::ArrayType<Double32_t> > " , diags , & t ) ;
2012-09-27 12:49:18 +04:00
QT = clang : : QualType ( t , 0 ) ;
2013-09-03 16:27:29 +04:00
Transform : : GetPartiallyDesugaredType ( Ctx , QT , transConfig ) . getAsString ( ) . c_str ( )
2014-03-31 17:09:55 +04:00
// CHECK: ({{[^)]+}}) "NS::Array<NS::ArrayType<Double32_t> >"
2012-09-27 12:49:18 +04:00
2014-02-19 15:54:31 +04:00
lookup . findScope ( " NS::Container<Long_t>::Content " , diags , & t ) ;
2012-09-27 12:49:18 +04:00
QT = clang : : QualType ( t , 0 ) ;
2013-09-03 16:27:29 +04:00
Transform : : GetPartiallyDesugaredType ( Ctx , QT , transConfig ) . getAsString ( ) . c_str ( )
2014-03-31 17:09:55 +04:00
// CHECK: ({{[^)]+}}) "NS::Container<long>::Content"
2012-09-27 12:49:18 +04:00
2014-02-19 15:54:31 +04:00
QT = lookup . findType ( " NS::Container<Long_t>::Value_t " , diags ) ;
2013-09-03 16:27:29 +04:00
Transform : : GetPartiallyDesugaredType ( Ctx , QT , transConfig ) . getAsString ( ) . c_str ( )
2014-03-31 17:09:55 +04:00
// CHECK: ({{[^)]+}}) "long"
2012-09-27 12:49:18 +04:00
2014-02-19 15:54:31 +04:00
lookup . findScope ( " NS::Container<Long_t>::Content_t " , diags , & t ) ;
2012-09-27 12:49:18 +04:00
QT = clang : : QualType ( t , 0 ) ;
2013-09-03 16:27:29 +04:00
Transform : : GetPartiallyDesugaredType ( Ctx , QT , transConfig ) . getAsString ( ) . c_str ( )
2014-03-31 17:09:55 +04:00
// CHECK: ({{[^)]+}}) "NS::Container<long>::Content"
2012-09-27 12:49:18 +04:00
2014-02-19 15:54:31 +04:00
lookup . findScope ( " NS::Container<Long_t>::Impl_t " , diags , & t ) ;
2012-09-27 12:49:18 +04:00
QT = clang : : QualType ( t , 0 ) ;
2013-09-03 16:27:29 +04:00
Transform : : GetPartiallyDesugaredType ( Ctx , QT , transConfig ) . getAsString ( ) . c_str ( )
2014-03-31 17:09:55 +04:00
// CHECK: ({{[^)]+}}) "Details::Impl"
2012-09-27 12:49:18 +04:00
2014-02-19 15:54:31 +04:00
lookup . findScope ( " NS::Container<Double32_t>::Content " , diags , & t ) ;
2012-09-27 12:49:18 +04:00
QT = clang : : QualType ( t , 0 ) ;
2013-09-03 16:27:29 +04:00
Transform : : GetPartiallyDesugaredType ( Ctx , QT , transConfig ) . getAsString ( ) . c_str ( )
2014-03-31 17:09:55 +04:00
// CHECK: ({{[^)]+}}) "NS::Container<Double32_t>::Content"
2012-09-27 12:49:18 +04:00
2014-02-19 15:54:31 +04:00
QT = lookup . findType ( " NS::Container<Double32_t>::Value_t " , diags ) ;
2013-09-03 16:27:29 +04:00
Transform : : GetPartiallyDesugaredType ( Ctx , QT , transConfig ) . getAsString ( ) . c_str ( )
2014-03-31 17:09:55 +04:00
// CHECK: ({{[^)]+}}) "double"
2012-09-27 12:49:18 +04:00
// Really we would want it to say Double32_t but oh well.
2014-02-19 15:54:31 +04:00
lookup . findScope ( " NS::Container<Double32_t>::Content_t " , diags , & t ) ;
2012-09-27 12:49:18 +04:00
QT = clang : : QualType ( t , 0 ) ;
2013-09-03 16:27:29 +04:00
Transform : : GetPartiallyDesugaredType ( Ctx , QT , transConfig ) . getAsString ( ) . c_str ( )
2014-03-31 17:09:55 +04:00
// CHECK: ({{[^)]+}}) "NS::Container<Double32_t>::Content"
2012-09-27 12:49:18 +04:00
2014-02-19 15:54:31 +04:00
lookup . findScope ( " NS::Container<Double32_t>::Impl_t " , diags , & t ) ;
2012-09-27 12:49:18 +04:00
QT = clang : : QualType ( t , 0 ) ;
2013-09-03 16:27:29 +04:00
Transform : : GetPartiallyDesugaredType ( Ctx , QT , transConfig ) . getAsString ( ) . c_str ( )
2014-03-31 17:09:55 +04:00
// CHECK: ({{[^)]+}}) "Details::Impl"
2012-09-27 12:49:18 +04:00
2014-02-19 15:54:31 +04:00
lookup . findScope ( " NS::TDataPointF " , diags , & t ) ;
2012-09-27 12:49:18 +04:00
QT = clang : : QualType ( t , 0 ) ;
2013-09-03 16:27:29 +04:00
Transform : : GetPartiallyDesugaredType ( Ctx , QT , transConfig ) . getAsString ( ) . c_str ( )
2014-03-31 17:09:55 +04:00
// CHECK: ({{[^)]+}}) "NS::TDataPoint<float>"
2012-09-27 12:49:18 +04:00
2014-02-19 15:54:31 +04:00
lookup . findScope ( " NS::TDataPointD32 " , diags , & t ) ;
2012-09-27 12:49:18 +04:00
QT = clang : : QualType ( t , 0 ) ;
2013-09-03 16:27:29 +04:00
Transform : : GetPartiallyDesugaredType ( Ctx , QT , transConfig ) . getAsString ( ) . c_str ( )
2014-03-31 17:09:55 +04:00
// CHECK: ({{[^)]+}}) "NS::TDataPoint<Double32_t>"
2012-12-11 12:26:00 +04:00
2014-02-19 15:54:31 +04:00
lookup . findScope ( " NS::ArrayType<float,1> " , diags , & t ) ;
2013-10-30 16:23:58 +04:00
QT = clang : : QualType ( t , 0 ) ;
Transform : : GetPartiallyDesugaredType ( Ctx , QT , transConfig ) . getAsString ( ) . c_str ( )
2014-03-31 17:09:55 +04:00
// CHECK: ({{[^)]+}}) "NS::ArrayType<float, 1>"
2013-10-30 16:23:58 +04:00
2014-02-19 15:54:31 +04:00
lookup . findScope ( " NS::FArray " , diags , & t ) ;
2013-10-30 16:23:58 +04:00
QT = clang : : QualType ( t , 0 ) ;
Transform : : GetPartiallyDesugaredType ( Ctx , QT , transConfig ) . getAsString ( ) . c_str ( )
2014-03-31 17:09:55 +04:00
// CHECK: ({{[^)]+}}) "NS::ArrayType<float, 2>"
2013-10-30 16:23:58 +04:00
2014-02-19 15:54:31 +04:00
QT = lookup . findType ( " const NS::IntNS_t " , diags ) ;
2013-11-06 20:04:33 +04:00
Transform : : GetPartiallyDesugaredType ( Ctx , QT , transConfig ) . getAsString ( ) . c_str ( )
2014-03-31 17:09:55 +04:00
// CHECK: ({{[^)]+}}) "const int"
2013-11-06 20:04:33 +04:00
2014-02-19 15:54:31 +04:00
lookup . findScope ( " vector<Details::Impl>::value_type " , diags , & t ) ;
2013-02-14 21:45:49 +04:00
QT = clang : : QualType ( t , 0 ) ;
2013-09-03 16:27:29 +04:00
Transform : : GetPartiallyDesugaredType ( Ctx , QT , transConfig ) . getAsString ( ) . c_str ( )
2014-03-31 17:09:55 +04:00
// CHECK: ({{[^)]+}}) "Details::Impl"
2013-02-14 21:45:49 +04:00
2014-02-19 15:54:31 +04:00
const clang : : Decl * decl = lookup . findScope ( " Embedded_objects " , diags , & t ) ;
2012-12-11 12:26:00 +04:00
if ( decl ) {
const clang : : CXXRecordDecl * cxxdecl
= llvm : : dyn_cast < clang : : CXXRecordDecl > ( decl ) ;
if ( cxxdecl ) {
clang : : DeclContext : : decl_iterator iter = cxxdecl - > decls_begin ( ) ;
while ( * iter ) {
const clang : : Decl * mdecl = * iter ;
if ( const clang : : ValueDecl * vd = llvm : : dyn_cast < clang : : ValueDecl > ( mdecl ) ) {
clang : : QualType vdType = vd - > getType ( ) ;
2012-12-11 14:41:56 +04:00
name . clear ( ) ;
2013-09-03 16:27:29 +04:00
Transform : : GetPartiallyDesugaredType ( Ctx , vdType , transConfig ) . getAsStringInternal ( name , Policy ) ;
2012-12-11 14:41:56 +04:00
std : : cout < < name . c_str ( ) < < std : : endl ;
2012-12-11 12:26:00 +04:00
}
+ + iter ;
}
}
}
2012-12-11 14:41:56 +04:00
// CHECK: Embedded_objects::EmbeddedClasses
// CHECK: Embedded_objects::EmbeddedClasses::Embedded1
// CHECK: Embedded_objects::EmbeddedClasses::Embedded2
// CHECK: Embedded_objects::EmbeddedClasses::Embedded3
// CHECK: Embedded_objects::EmbeddedClasses::Embedded4
// CHECK: Embedded_objects::EmbeddedClasses::Embedded5
// CHECK: Embedded_objects::EmbeddedClasses::Embedded6
2014-03-21 03:27:54 +04:00
// CHECK: std::vector<int> *
2013-02-08 02:56:10 +04:00
// CHECK: const Embedded_objects::Eenum
2014-03-21 03:27:54 +04:00
// CHECK: std::vector<int> *
2014-03-21 18:48:31 +04:00
// CHECK: std::vector<Double32_t>
// CHECK: std::vector<Double32_t>
// CHECK: std::vector<Double32_t>
// CHECK: std::vector<float>
// NOT-YET-CHECK: std::vector<Double32_t>
// CHECK: Double32_t *
// CHECK: float *
// NOT-YET-CHECK: Double32_t *
2014-05-14 06:01:01 +04:00
// CHECK: B<int, Double32_t>
// CHECK: B<int, Double32_t> *
// CHECK: B<int, Double32_t> *[5]
// CHECK: B<int, Double32_t> **
// CHECK: B<int, Double32_t> **[3]
// CHECK: B<int, Double32_t> **[4][3]
// CHECK: B<int, Double32_t> **(&)[4][3]
// CHECK: B<int, Double32_t> &
// CHECK: B<int, Double32_t> *&
// CHECK: B<int, Double32_t> *
// CHECK: B<int, Double32_t> **(*)[4][3]
2013-02-08 02:56:10 +04:00
// In the partial desugaring add support for the case where we have a type
// that point to an already completely desugared template instantiation in
// which case the type is a RecordDecl rather than a TemplateInstantationType
2014-02-19 15:54:31 +04:00
decl = lookup . findScope ( " std::pair<Details::Impl,std::vector<Details::Impl> > " , diags , & t ) ;
2013-02-08 02:56:10 +04:00
QT = clang : : QualType ( t , 0 ) ;
2013-09-03 16:27:29 +04:00
std : : cout < < Transform : : GetPartiallyDesugaredType ( Ctx , QT , transConfig ) . getAsString ( ) . c_str ( ) < < std : : endl ;
2013-02-08 02:56:10 +04:00
// CHECK: std::pair<Details::Impl, std::vector<Details::Impl> >
if ( const clang : : RecordDecl * rdecl = llvm : : dyn_cast_or_null < clang : : RecordDecl > ( decl ) ) {
clang : : RecordDecl : : field_iterator field_iter = rdecl - > field_begin ( ) ;
// For some reason we can not call field_end:
// cling: root/interpreter/llvm/src/tools/clang/lib/CodeGen/CGCall.cpp:1839: void checkArgMatches(llvm::Value*, unsigned int&, llvm::FunctionType*): Assertion `Elt->getType() == FTy->getParamType(ArgNo)' failed.
// so just 'guess' the size
int i = 0 ;
while ( i < 2 ) {
name . clear ( ) ;
clang : : QualType fdType = field_iter - > getType ( ) ;
2013-09-03 16:27:29 +04:00
Transform : : GetPartiallyDesugaredType ( Ctx , fdType , transConfig ) . getAsStringInternal ( name , Policy ) ;
2013-02-08 02:56:10 +04:00
std : : cout < < name . c_str ( ) < < std : : endl ;
+ + field_iter ;
+ + i ;
}
}
// CHECK: Details::Impl
// CHECK: std::vector<Details::Impl, std::allocator<Details::Impl> >
2012-12-11 12:26:00 +04:00
2013-03-01 23:05:54 +04:00
2014-02-19 15:54:31 +04:00
decl = lookup . findScope ( " NS1::NS2::NS3::Inner3 " , diags , & t ) ;
2013-03-01 23:05:54 +04:00
if ( decl ) {
const clang : : CXXRecordDecl * cxxdecl
= llvm : : dyn_cast < clang : : CXXRecordDecl > ( decl ) ;
if ( cxxdecl ) {
clang : : DeclContext : : decl_iterator iter = cxxdecl - > decls_begin ( ) ;
while ( * iter ) {
const clang : : Decl * mdecl = * iter ;
if ( const clang : : ValueDecl * vd = llvm : : dyn_cast < clang : : ValueDecl > ( mdecl ) ) {
clang : : QualType vdType = vd - > getType ( ) ;
name . clear ( ) ;
2013-09-03 16:27:29 +04:00
Transform : : GetPartiallyDesugaredType ( Ctx , vdType , transConfig ) . getAsStringInternal ( name , Policy ) ;
2013-03-01 23:05:54 +04:00
std : : cout < < name . c_str ( ) < < std : : endl ;
}
+ + iter ;
}
}
}
// CHECK: NS1::NS2::NS3::Point
// CHECK: NS1::NS2::NS3::Point
// CHECK: NS1::NS2::NS3::Point
2014-02-19 15:54:31 +04:00
decl = lookup . findScope ( " cmap<volatile int,volatile int> " , diags , & t ) ;
2013-02-12 22:38:58 +04:00
QT = clang : : QualType ( t , 0 ) ;
2013-09-03 16:27:29 +04:00
std : : cout < < Transform : : GetPartiallyDesugaredType ( Ctx , QT , transConfig ) . getAsString ( ) . c_str ( ) < < std : : endl ;
2013-02-12 22:38:58 +04:00
if ( const clang : : RecordDecl * rdecl = llvm : : dyn_cast_or_null < clang : : RecordDecl > ( decl ) ) {
QT = clang : : QualType ( rdecl - > getTypeForDecl ( ) , 0 ) ;
2013-09-03 16:27:29 +04:00
std : : cout < < Transform : : GetPartiallyDesugaredType ( Ctx , QT , transConfig ) . getAsString ( ) . c_str ( ) < < std : : endl ;
2013-02-12 22:38:58 +04:00
clang : : RecordDecl : : field_iterator field_iter = rdecl - > field_begin ( ) ;
// For some reason we can not call field_end:
// cling: root/interpreter/llvm/src/tools/clang/lib/CodeGen/CGCall.cpp:1839: void checkArgMatches(llvm::Value*, unsigned int&, llvm::FunctionType*): Assertion `Elt->getType() == FTy->getParamType(ArgNo)' failed.
// so just 'guess' the size
int i = 0 ;
while ( i < 2 ) {
name . clear ( ) ;
clang : : QualType fdType = field_iter - > getType ( ) ;
2013-09-03 16:27:29 +04:00
Transform : : GetPartiallyDesugaredType ( Ctx , fdType , transConfig ) . getAsStringInternal ( name , Policy ) ;
2013-02-12 22:38:58 +04:00
std : : cout < < name . c_str ( ) < < std : : endl ;
+ + field_iter ;
+ + i ;
}
}
// CHECK: cmap<volatile int, volatile int>
// CHECK: cmap<volatile int, volatile int, std::less<volatile int>, std::allocator<std::pair<const volatile int, volatile int> > >
// CHECK: volatile int
// CHECK: const volatile int