forked from OSchip/llvm-project
[ODRHash] Don't hash friend functions.
In certain combinations of templated classes and friend functions, the body of friend functions does not get propagated along with function signature. Exclude friend functions for hashing to avoid this case. llvm-svn: 322350
This commit is contained in:
parent
64a0db76f9
commit
4eefb4511d
|
@ -478,6 +478,8 @@ void ODRHash::AddFunctionDecl(const FunctionDecl *Function) {
|
|||
|
||||
// TODO: Fix hashing for class methods.
|
||||
if (isa<CXXMethodDecl>(Function)) return;
|
||||
// And friend functions.
|
||||
if (Function->getFriendObjectKind()) return;
|
||||
|
||||
// Skip functions that are specializations or in specialization context.
|
||||
const DeclContext *DC = Function;
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
template <class T>
|
||||
struct iterator {
|
||||
void Compare(const iterator &x) { }
|
||||
friend void Check(iterator) {}
|
||||
};
|
||||
|
||||
template <class T = int> struct Box {
|
||||
iterator<T> I;
|
||||
|
||||
void test() {
|
||||
Check(I);
|
||||
I.Compare(I);
|
||||
}
|
||||
};
|
|
@ -0,0 +1,6 @@
|
|||
#include "Box.h"
|
||||
|
||||
void Peek() {
|
||||
Box<> Gift;
|
||||
Gift.test();
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
#include "Box.h"
|
||||
void x() {
|
||||
Box<> Unused;
|
||||
//Unused.test();
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
#include "Box.h"
|
||||
#include "M2.h"
|
||||
|
||||
void Party() {
|
||||
Box<> Present;
|
||||
Present.test();
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
module Box {
|
||||
header "Box.h"
|
||||
}
|
||||
|
||||
module Module1 {
|
||||
header "M1.h"
|
||||
}
|
||||
|
||||
module Module2 {
|
||||
header "M2.h"
|
||||
}
|
||||
|
||||
module Module3 {
|
||||
header "M3.h"
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
// RUN: rm -rf %t
|
||||
|
||||
// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t/modules.cache \
|
||||
// RUN: -I %S/Inputs/odr_hash-Friend \
|
||||
// RUN: -emit-obj -o /dev/null \
|
||||
// RUN: -fmodules \
|
||||
// RUN: -fimplicit-module-maps \
|
||||
// RUN: -fmodules-cache-path=%t/modules.cache \
|
||||
// RUN: -std=c++11 -x c++ %s -verify
|
||||
|
||||
// expected-no-diagnostics
|
||||
|
||||
#include "Box.h"
|
||||
#include "M1.h"
|
||||
#include "M3.h"
|
||||
|
||||
void Run() {
|
||||
Box<> Present;
|
||||
}
|
Loading…
Reference in New Issue