forked from OSchip/llvm-project
[ODRHash] Support pointer and reference types.
llvm-svn: 328404
This commit is contained in:
parent
3e65a06015
commit
8ce0ab3923
|
@ -642,6 +642,24 @@ public:
|
|||
VisitFunctionType(T);
|
||||
}
|
||||
|
||||
void VisitPointerType(const PointerType *T) {
|
||||
AddQualType(T->getPointeeType());
|
||||
VisitType(T);
|
||||
}
|
||||
|
||||
void VisitReferenceType(const ReferenceType *T) {
|
||||
AddQualType(T->getPointeeTypeAsWritten());
|
||||
VisitType(T);
|
||||
}
|
||||
|
||||
void VisitLValueReferenceType(const LValueReferenceType *T) {
|
||||
VisitReferenceType(T);
|
||||
}
|
||||
|
||||
void VisitRValueReferenceType(const RValueReferenceType *T) {
|
||||
VisitReferenceType(T);
|
||||
}
|
||||
|
||||
void VisitTypedefType(const TypedefType *T) {
|
||||
AddDecl(T->getDecl());
|
||||
QualType UnderlyingType = T->getDecl()->getUnderlyingType();
|
||||
|
|
|
@ -2287,6 +2287,128 @@ Invalid1 i1;
|
|||
} // namespace BaseClass
|
||||
|
||||
|
||||
namespace PointersAndReferences {
|
||||
#if defined(FIRST) || defined(SECOND)
|
||||
template<typename> struct Wrapper{};
|
||||
#endif
|
||||
|
||||
#if defined(FIRST)
|
||||
struct S1 {
|
||||
Wrapper<int*> x;
|
||||
};
|
||||
#elif defined(SECOND)
|
||||
struct S1 {
|
||||
Wrapper<float*> x;
|
||||
};
|
||||
#else
|
||||
S1 s1;
|
||||
// expected-error@first.h:* {{PointersAndReferences::S1::x' from module 'FirstModule' is not present in definition of 'PointersAndReferences::S1' in module 'SecondModule'}}
|
||||
// expected-note@second.h:* {{declaration of 'x' does not match}}
|
||||
#endif
|
||||
|
||||
#if defined(FIRST)
|
||||
struct S2 {
|
||||
Wrapper<int &&> x;
|
||||
};
|
||||
#elif defined(SECOND)
|
||||
struct S2 {
|
||||
Wrapper<float &&> x;
|
||||
};
|
||||
#else
|
||||
S2 s2;
|
||||
// expected-error@first.h:* {{PointersAndReferences::S2::x' from module 'FirstModule' is not present in definition of 'PointersAndReferences::S2' in module 'SecondModule'}}
|
||||
// expected-note@second.h:* {{declaration of 'x' does not match}}
|
||||
#endif
|
||||
|
||||
#if defined(FIRST)
|
||||
struct S3 {
|
||||
Wrapper<int *> x;
|
||||
};
|
||||
#elif defined(SECOND)
|
||||
struct S3 {
|
||||
Wrapper<float *> x;
|
||||
};
|
||||
#else
|
||||
S3 s3;
|
||||
// expected-error@first.h:* {{PointersAndReferences::S3::x' from module 'FirstModule' is not present in definition of 'PointersAndReferences::S3' in module 'SecondModule'}}
|
||||
// expected-note@second.h:* {{declaration of 'x' does not match}}
|
||||
#endif
|
||||
|
||||
#if defined(FIRST)
|
||||
struct S4 {
|
||||
Wrapper<int &> x;
|
||||
};
|
||||
#elif defined(SECOND)
|
||||
struct S4 {
|
||||
Wrapper<float &> x;
|
||||
};
|
||||
#else
|
||||
S4 s4;
|
||||
// expected-error@first.h:* {{PointersAndReferences::S4::x' from module 'FirstModule' is not present in definition of 'PointersAndReferences::S4' in module 'SecondModule'}}
|
||||
// expected-note@second.h:* {{declaration of 'x' does not match}}
|
||||
#endif
|
||||
|
||||
#if defined(FIRST)
|
||||
struct S5 {
|
||||
Wrapper<S5 *> x;
|
||||
};
|
||||
#elif defined(SECOND)
|
||||
struct S5 {
|
||||
Wrapper<const S5 *> x;
|
||||
};
|
||||
#else
|
||||
S5 s5;
|
||||
// expected-error@second.h:* {{'PointersAndReferences::S5::x' from module 'SecondModule' is not present in definition of 'PointersAndReferences::S5' in module 'FirstModule'}}
|
||||
// expected-note@first.h:* {{declaration of 'x' does not match}}
|
||||
#endif
|
||||
|
||||
#if defined(FIRST)
|
||||
struct S6 {
|
||||
Wrapper<int &> x;
|
||||
};
|
||||
#elif defined(SECOND)
|
||||
struct S6 {
|
||||
Wrapper<const int &> x;
|
||||
};
|
||||
#else
|
||||
S6 s6;
|
||||
// expected-error@first.h:* {{PointersAndReferences::S6::x' from module 'FirstModule' is not present in definition of 'PointersAndReferences::S6' in module 'SecondModule'}}
|
||||
// expected-note@second.h:* {{declaration of 'x' does not match}}
|
||||
#endif
|
||||
|
||||
#define DECLS \
|
||||
Wrapper<int *> x1; \
|
||||
Wrapper<float *> x2; \
|
||||
Wrapper<const float *> x3; \
|
||||
Wrapper<int &> x4; \
|
||||
Wrapper<int &&> x5; \
|
||||
Wrapper<const int &> x6; \
|
||||
Wrapper<S1 *> x7; \
|
||||
Wrapper<S1 &> x8; \
|
||||
Wrapper<S1 &&> x9;
|
||||
|
||||
#if defined(FIRST) || defined(SECOND)
|
||||
struct Valid1 {
|
||||
DECLS
|
||||
};
|
||||
#else
|
||||
Valid1 v1;
|
||||
#endif
|
||||
|
||||
#if defined(FIRST) || defined(SECOND)
|
||||
struct Invalid1 {
|
||||
DECLS
|
||||
ACCESS
|
||||
};
|
||||
#else
|
||||
Invalid1 i1;
|
||||
// expected-error@second.h:* {{'PointersAndReferences::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}}
|
||||
// expected-note@first.h:* {{but in 'FirstModule' found public access specifier}}
|
||||
#endif
|
||||
#undef DECLS
|
||||
} // namespace PointersAndReferences
|
||||
|
||||
|
||||
// Collection of interesting cases below.
|
||||
|
||||
// Naive parsing of AST can lead to cycles in processing. Ensure
|
||||
|
|
Loading…
Reference in New Issue