diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2009-07-24 20:28:49 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-07-24 20:28:49 +0000 |
commit | a5c335527d31859f8a87af0a6147a095accdfdd7 (patch) | |
tree | 9035de6639ce82604cbf90977c4c01ec7c06ff5d /clang | |
parent | 70fa4661ebd6a79570cc69c0a3d5a4991338a461 (diff) | |
download | bcm5719-llvm-a5c335527d31859f8a87af0a6147a095accdfdd7.tar.gz bcm5719-llvm-a5c335527d31859f8a87af0a6147a095accdfdd7.zip |
More Sema check for constructor's member initializer along
with type conversion to fix ir-gen crash.
llvm-svn: 77000
Diffstat (limited to 'clang')
-rw-r--r-- | clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 | ||||
-rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 9 | ||||
-rw-r--r-- | clang/test/SemaCXX/constructor-initializer.cpp | 10 |
3 files changed, 19 insertions, 2 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 881e9d90a10..9031a6ec9cc 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -1664,6 +1664,8 @@ def error_multiple_base_initialization : Error < def err_mem_init_not_member_or_class : Error< "member initializer %0 does not name a non-static data member or base " "class">; +def err_mem_initializer_mismatch : Error< + "Too many arguments for member initializer %0">; def warn_field_initialized : Warning< "member '%0' will be initialized after">, diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index d5c8c3d3fce..7b0c9c6ca47 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -725,6 +725,15 @@ Sema::ActOnMemInitializer(DeclPtrTy ConstructorD, C = PerformInitializationByConstructor( FieldType, (Expr **)Args, NumArgs, IdLoc, SourceRange(IdLoc, RParenLoc), Member->getDeclName(), IK_Direct); + else if (NumArgs != 1) + return Diag(IdLoc, diag::err_mem_initializer_mismatch) + << MemberOrBase << SourceRange(IdLoc, RParenLoc); + else { + Expr * NewExp = (Expr*)Args[0]; + if (PerformCopyInitialization(NewExp, FieldType, "passing")) + return true; + Args[0] = NewExp; + } // FIXME: Perform direct initialization of the member. return new (Context) CXXBaseOrMemberInitializer(Member, (Expr **)Args, NumArgs, C, IdLoc); diff --git a/clang/test/SemaCXX/constructor-initializer.cpp b/clang/test/SemaCXX/constructor-initializer.cpp index 71d38a1438b..3909cd984dd 100644 --- a/clang/test/SemaCXX/constructor-initializer.cpp +++ b/clang/test/SemaCXX/constructor-initializer.cpp @@ -98,8 +98,7 @@ struct Current : Derived { }; // FIXME. This is bad message! -struct M { // expected-note {{candidate function}} \ - // expected-note {{candidate function}} +struct M { M(int i, int j); // expected-note {{candidate function}} \ // // expected-note {{candidate function}} }; @@ -115,4 +114,11 @@ struct P : M { // expected-error {{default constructor for 'struct M' is missin M m; // expected-error {{default constructor for 'struct M' is missing in initialization of mamber}} }; +struct Q { + Q() : f1(1,2), // expected-error {{Too many arguments for member initializer 'f1'}} + pf(0.0) { } // expected-error {{incompatible type passing 'double', expected 'float *'}} + float f1; + + float *pf; +}; |